似乎如果我创建一个进程,派它并从父进程向子进程发送一个SIGHUP,那么子进程就会死掉,但它的“/ proc / PID”目录不会消失,直到父进程死掉。 (见下面的代码)。
让父母检查孩子是否已经死亡的正确方法是什么?
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <errno.h>
#include <signal.h>
void testprocdir(pid_t pid) {
struct stat sb;
char path[1024];
sprintf(path,"/proc/%d",pid);
if(stat(path, &sb)==-1 && errno == ENOENT) {
printf("%s does not exist\n", path);
} else {
printf("%s exists\n", path);
}
}
int main(int argc,char **argv) {
pid_t parent,child;
parent=getpid();
printf("I am %d\n",parent);
child=fork();
switch(child) {
case -1:
printf("Forking failed\n");
return 2;
case 0:
parent=getppid();
child=getpid();
printf("I am the child (%d) and my parent is %d\n", child, parent);
while(1) { sleep(1); printf("I am the child and I have slept 1s\n");}
printf("This line should not be visible\n");
}
sleep(1); //make sure kid is in the while loop
printf("I am the parent (%d) and my kid is %d\n", parent, child);
kill(child,SIGHUP);
testprocdir(parent);
printf("Waiting 5s before testing if the procdir of the child (/proc/%d) is removed\n",child);
sleep(5);
testprocdir(child);
return 0;
}
答案 0 :(得分:3)
您可以使用wait系列调用。
答案 1 :(得分:1)
我将从一些概念开始:
操作系统将保留一个子进程&#39;进程表中的条目(包括退出状态),直到父调用waitpid(或另一个wait-family函数)或直到父进程退出(此时init进程收集状态)。这就是&#34; zombie&#34;进程是:已经退出的进程仍然驻留在进程表中以实现此目的。这个过程&#39;第一次调用waitpid后,表中的条目应该消失。
另外,从手册页:
终止但未等待的孩子会成为&#34;僵尸&#34;。内核维护有关僵尸进程(PID,终止状态,资源使用信息)的最小信息集,以便允许父进程稍后执行等待以获取有关该子进程的信息。
因此,通过使用wait函数系列,您可以检查子进程的状态。 还有一些宏可用于等待函数族来检查子进程的状态,如WEXITSTATUS,WIFSIGNALED,WIFEXITED等。
答案 2 :(得分:0)
fork
返回父进程中子进程的PID,子进程中返回0。
man waitpid
应该提供足够的方向来调用父级中的waitpid
,允许您检查子进程或所有子进程 - 包括允许父进程继续执行的能力孩子还活着或停止父母的所有处决,直到孩子死了。