【发布时间】:2011-06-05 16:36:25
【问题描述】:
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
int main(){
pid_t pid = fork();
if(pid==0){
system("watch ls");
}
else{
sleep(5);
killpg(getpid(),SIGTERM); //to kill the complete process tree.
}
return 0;
}
终端:
anirudh@anirudh-Aspire-5920:~/Desktop/testing$ gcc test.c
anirudh@anirudh-Aspire-5920:~/Desktop/testing$ ./a.out
Terminated
前 5 秒显示“watch ls”的输出,然后它终止,因为我发送了一个 SIGTERM。
问题:进程如何杀死自己?我已经完成了 kill(getpid(),SIGTERM);
我的假设: 所以在 kill() 调用过程中,进程切换到内核模式。 kill 调用将 SIGTERM 发送到进程并将其复制到进程的进程表中。当进程返回用户模式时,它会在其表中看到信号并自行终止(如何?我真的不知道) (我认为我的假设中某处出错了(可能是一个错误)......所以请赐教)
此代码实际上是我用来测试项目的其他模块的存根。 它为我完成了这项工作,我对此感到满意,但在我的脑海中存在一个问题,一个过程实际上是如何杀死自己的。我想知道分步假设。
提前致谢
阿尼鲁德·托默
【问题讨论】:
-
为什么进程要杀死自己?如果它决定终止,它不只是调用
exit()吗? -
你如何杀死没有生命的东西???
-
原因是在上述情况下,如果你调用 exit() 而不是 kill 那么只有父进程被杀死。子进程成为孤儿,init 成为它的新父进程,它仍在继续运行。
-
我希望终止整个进程树。如果我使用 killpg(pid,SIGTERM) 它对我不起作用,它只会杀死孩子,并且“system()”函数的进程会继续运行。我尝试做 killpg(getpid(),SIGTERM) 并且它为我完成了这项工作。但同样的问题是这怎么可能?
-
也许你应该编辑你的问题来询问如何杀死整个进程树,因为这似乎是你真正想要的。
标签: linux process kill signal-handling sigterm