父母杀死孩子后,孩子的Linux / proc / PID dir保持活着状态

时间:2014-08-19 11:08:35

标签: c linux fork pid procfs

似乎如果我创建一个进程,派它并从父进程向子进程发送一个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;
}

3 个答案:

答案 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,允许您检查子进程或所有子进程 - 包括允许父进程继续执行的能力孩子还活着或停止父母的所有处决,直到孩子死了。