#include #include #include #include #include void dowait () { int status; pid_t pid; while (1) { pid = wait (&status); if (pid < 0) { if (errno == ECHILD) { printf ("No children to wait for?\n"); break; } else { perror ("wait"); continue; } } if (WIFEXITED (status)) { printf ("Child exited normally, exit code: %d\n", WEXITSTATUS (status)); } else if (WIFSIGNALED (status)) { printf ("Child died due to signal %d, ", WTERMSIG (status)); if (WCOREDUMP (status)) { printf ("core dumped\n"); } else { printf ("no core\n"); } } else { printf ("Something else\n"); } break; } } int doexec (char * arg1) { pid_t pid = fork (); if (pid < 0) { /* Error */ perror ("fork"); return 0; } if (pid == 0) { /* Child */ if (arg1 == NULL) execl ("./toexec", "toexec", NULL); else execl ("./toexec", "toexec", arg1, NULL); perror ("exec"); exit (1); } /* Parent: Nothing else to do. */ return 1; } int main () { char arg[2]; if (doexec (NULL)) dowait (); arg[1] = 0; for (arg[0] = 'a'; arg[0] <= 'z'; arg[0]++) { if (doexec (arg)) dowait (); } return 0; }