Hi,
I must be doing something really silly but it seems waitpid ends up
returning -1 if WNOHANG is specified and there are no children to
reap.
Am I doing something wrong ?
#include <sys/types.h>
#include <sys/wait.h>
#include <err.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void reap_children(void);
sig_atomic_t gotchild;
void
childhandler(int signo)
{
gotchild = 1;
}
void
reap_children(void)
{
pid_t pid;
int status;
while ((pid = waitpid(WAIT_ANY, &status, WNOHANG)) > 0) {
printf("Children %d reaped, terminated on ", pid);
if (WIFEXITED(status))
printf("exit(%d)", WEXITSTATUS(status));
if (WIFSIGNALED(status))
printf("signal %d", WTERMSIG(status));
printf("\n");
};
if (pid == -1)
err(1, "waitpid");
gotchild = 0;
}
int
main(void)
{
pid_t pid;
signal(SIGCHLD, childhandler);
if ((pid = fork()) == -1)
err(1, "fork");
if (pid == 0) /* exit child */
exit(1);
if ((pid = fork()) == -1)
err(1, "fork");
if (pid == 0) /* exit child */
exit(1);
for (;;) {
if (gotchild)
reap_children();
sleep(1);
}
}
Here is the output:
Children 3318 reaped, terminated on exit(1)
Children 11320 reaped, terminated on exit(1)
waitpid: waitpid: No child processes