我要求孩子,并试图杀死它。
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>
答案 0 :(得分:0)
子进程 已经死了,只是进程条目会一直存在,直到有人收集退出代码。
如果父母没有这样做,它最终将由init
继承,这将在某个时刻收获。
答案 1 :(得分:0)
因此,if()子句的上部分支在主进程中执行,您将子进程ID(存储在a
中)复制到child_pid
。
在较低的分支中,你处于子进程中,在那里取child_pid
,这是你自己的,然后高兴地自杀()你自己...这就是为什么你永远不会得到这条线'被杀... “
正如paxdiablo指出的那样,由于这是一个子进程,它将保持僵尸状态,直到您使用wait()
获取退出状态或主进程退出。
顺便说一句,我不确定你想用这段代码做什么: