#include #include #include #include #include extern "C" { typedef void (*sig_handler_t)(int); void sig_handler (int s) { // re-register signal (s, sig_handler); } } // extern "C" int main () { const pid_t pid = fork (); if (0 == pid) { sleep (3); } else { sig_handler_t old_handler = signal (SIGCHLD, sig_handler); // wait 5 seconds for child to exit unsigned wait = 5; do { int status = 0; const pid_t ret = waitpid (pid, &status, WNOHANG); if (ret < 0) { fprintf (stderr, "failed waiting for child!\n"); return 1; } else if (0 == ret) { // child still alive, wait a little while fprintf (stdout, "waiting...\n"); wait = sleep (wait); // try again continue; } else { // child exited } } while (0); signal (SIGCLD, old_handler); } return 0; }