无法终止分叉的进程
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() 的手册页)。
我正在分叉一个 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() 的手册页)。