无法杀死分叉进程

时间:2015-07-27 09:48:03

标签: linux fork posix sigkill

我要求孩子,并试图杀死它。

pid_t *child_pid;

int main(){
    child_pid = mmap(NULL, sizeof(pid_t), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);$

    int a = fork();
    if (a != 0) {
            printf("child @ %d\n", a);
            *child_pid = a;
            system("sleep 100");
    } else {
            sleep(1);
            printf("Trying to kill %d\n", *child_pid);
            int ret = kill(*child_pid,SIGKILL);
            printf("killled with %d\n", ret);
    }
}

然而,kill命令卡在:

child @ 4752 
Trying to kill 4752

与此同时,调用 ps 会显示:

4752 pts/4    00:00:00 simple <defunct>

2 个答案:

答案 0 :(得分:0)

子进程 已经死了,只是进程条目会一直存在,直到有人收集退出代码。

如果父母没有这样做,它最终将由init继承,这将在某个时刻收获。

答案 1 :(得分:0)

你杀了自己。 fork()如果你在forked进程中,则返回0,或者在'master'进程中返回子进程id(PID)。

因此,if()子句的上部分支在主进程中执行,您将子进程ID(存储在a中)复制到child_pid

在较低的分支中,你处于子进程中,在那里取child_pid,这是你自己的,然后高兴地自杀()你自己...这就是为什么你永远不会得到这条线'被杀... “

正如paxdiablo指出的那样,由于这是一个子进程,它将保持僵尸状态,直到您使用wait()获取退出状态或主进程退出。

顺便说一句,我不确定你想用这段代码做什么:

  • 如果要优雅地退出子进程,可以执行exit()。
  • 如果要杀死子进程,请跟踪子PID(由fork()返回),然后从主进程中kill()它。
  • 如果你想从你的孩子那里杀死主进程(可能听起来很奇怪),要小心,因为这可能会带子进程。您必须从主进程中分离子进程(请参阅守护进程()的手册页。)