Here is an example, waitpid system call will block parent process until child process exits:
JavaScript
x
pid_t pid = fork();
if (pid < 0) {
printf("errorn");
return -1;
} else if (pid == 0) {
printf("childn");
do_sonmething_in_child();
} else {
int status;
waitpid(pid, &status, 0);
printf("waitpid returned,do something elsen");
do_something_else();
}
What I want to achieve is parent process won’t be blocked, this can be done by using signal, so I changed my code:
JavaScript
void handler(int n) {
printf("handler %dn", n);
int status;
wait(&status);
}
pid_t pid = fork();
if (pid < 0) {
printf("errorn");
return -1;
} else if (pid == 0) {
printf("childn");
do_sonmething_in_child();
} else {
int status;
signal(SIGCHLD, handler);
do_something_else();
}
But another problem comes, if child exit before signal(SIGCHLD, handler), child will be a zombie, we can’t expect the child exit after signal(SIGCHLD, handler) is invoked, so, how to solve my problem?
Advertisement
Answer
You can set the signal handler before the fork () call.