#include #include #include #include int parallel_max = 4; int n_jobs = 0; void wait_for_job(void) { pid_t p; p = wait(NULL); if (p <= 0) { perror("wait failed"); exit(1); } --n_jobs; } void wait_for_all_jobs(void) { while (n_jobs) { wait_for_job(); } } void start_job(char *const argv[]) { pid_t p; if (n_jobs == parallel_max) { wait_for_job(); } p = fork(); if (p < 0) { perror("fork failed"); exit(1); } else if (p == 0) { execvp(argv[0], argv); perror("exec failed"); exit(1); } ++n_jobs; } int main(void) { char *cmd[] = { "bash", "-c", "s=$[$RANDOM % 10 + 1]; echo start $s; sleep $s; echo done", NULL }; int i; for (i=0; i<10; ++i) { start_job(cmd); } wait_for_all_jobs(); return 0; }