2011-03-12 77 views
0

使用fork系统调用时,我看到很多次父进程调用waitpid以便子进程完成。通知父进程

我在这里的问题是孩子发送通知给父母preocess。如果不使用任何共享资源,父母如何识别chil已完成?

回答

4

当孩子退出时,操作系统向父母发送SIGCHLD。您可以选择使用WNOHANG轮询waitpid(),或者在收到SIGCHLD后仅与wait()进行核对。子进程不需要特别做任何事情,这一切都由操作系统管理。

1

在Linux操作系统中,每个孩子都有一些父母,即使父母在孩子之前死亡,该孩子也被init(PID:1)进程继承。这样做是为了不应该有任何僵尸进程(进程表中存在进程表,但进程实际上已经死亡),这会占用无用的内存空间。

内核会关注所有因完全执行或由于其他原因(如无效内存访问)而死亡的进程,并保留一些信息,如孩子的退出状态。当孩子终止SIGCHLD信号发送给父母。默认情况下,信号被忽略。但是,通常在SIGCHLD的处理程序中实现系统调用,以便父级可以根据子级的退出状态进行操作。

0

除了通过SIGCHLD作为mentioned作者Erik之外,您还可以使用WNOHANG来轮询孩子感兴趣的事件。这里有一个例子:

pid_t pid = fork(); 
if (pid) { 
    while (1) { 
     int status; 
     int waitpid(pid, &status, WNOHANG); 
     if (pid == waitpid && WIFEXITED(status)) 
      break;    
     // do other stuff 
    } 
}