gpt4 book ai didi

linux - 无法终止 fork 进程

转载 作者:太空宇宙 更新时间:2023-11-04 03:35:47 25 4
gpt4 key购买 nike

我正在 fork 一个 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>

最佳答案

你正在自杀。如果您处于 fork 进程中,则 fork() 返回 0,或者返回“主”进程中的子进程 ID (PID)。

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

在较低的分支中,您位于子进程中,其中获取您自己的 child_pid,然后愉快地自己杀死()...这就是为什么您永远不会收到“Killed with...”行的原因

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

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

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

关于linux - 无法终止 fork 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31649878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com