【发布时间】:2017-10-07 08:35:51
【问题描述】:
这里是一个例子,waitpid系统调用会阻塞父进程,直到子进程退出:
pid_t pid = fork();
if (pid < 0) {
printf("error\n");
return -1;
} else if (pid == 0) {
printf("child\n");
do_sonmething_in_child();
} else {
int status;
waitpid(pid, &status, 0);
printf("waitpid returned,do something else\n");
do_something_else();
}
我想要实现的是父进程不会被阻塞,这可以通过使用信号来完成,所以我改变了我的代码:
void handler(int n) {
printf("handler %d\n", n);
int status;
wait(&status);
}
pid_t pid = fork();
if (pid < 0) {
printf("error\n");
return -1;
} else if (pid == 0) {
printf("child\n");
do_sonmething_in_child();
} else {
int status;
signal(SIGCHLD, handler);
do_something_else();
}
但是另一个问题来了,如果子在signal(SIGCHLD, handler)之前退出,子将是僵尸,我们不能指望子在之后退出>signal(SIGCHLD, handler)被调用了,请问我的问题怎么解决?
【问题讨论】:
-
嗨聪,我不明白你说“如果孩子存在,那就是僵尸”。如何?如果它关闭/死亡,它如何被标记为僵尸?
-
因为他的父级没有调用等待系统调用,执行等待可以让系统释放与子级关联的资源,如果没有执行等待,则终止的子级仍然处于“僵尸”状态状态。