#define _GNU_SOURCE #include #include #include #include #include #include void xexit(const char* msg) { puts(msg); exit(EXIT_FAILURE); } void* xalloc(int sz) { void* ptr = malloc(sz); if(ptr == NULL) { xexit("unable to alloc memory"); } return ptr; } static int childFunc(void *arg __attribute__((unused))) { puts("child: start"); sleep(2); puts("child: terminate"); return 0; } int main(int argc, char *argv[]) { pid_t *pids; size_t nproc, i; int ret = EXIT_SUCCESS; if (argc != 2) { puts("Wrong way to execute the program:\n" "\t\t./forkwait nProcesses\n" "example:\t./waitpid 2"); return EXIT_FAILURE; } nproc = atol(argv[1]); pids = xalloc(nproc * sizeof(pid_t)); for (i = 0; i < nproc; i++) { int pid = fork(); if(pid == 0) { childFunc(NULL); free(pids); exit(0); } else { pids[i] = pid; } } sleep(1); for (i = 0; i < nproc; i++) { if (waitpid(pids[i], NULL, 0) == -1) { puts("errror on waitpid"); ret = EXIT_FAILURE; } else { printf("child %ld has terminated\n", (long)pids[i]); } } free(pids); return ret; }