无法终止分叉的进程

Not able to kill a fork'ed process

我正在分叉一个 child,并试图杀死它。

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>

子进程死掉,只是进程入口会一直挂起,直到有人收集退出代码。

如果父辈不做,最终会被init继承,在某个时候收获。

你在自杀。 fork() returns 0 如果您在分叉进程中,或者 'master' 进程中的子进程 ID (PID)。

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

在较低的分支中,您处于子进程中,在那里获取 child_pid,这是您自己的,然后自己愉快地 kill()...这就是为什么您永远不会得到 'Killed with...'

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

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

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