过程如何自杀?
#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;
}
终端:过程如何自杀?
[email protected]:~/Desktop/testing$ gcc test.c
[email protected]:~/Desktop/testing$ ./a.out
Terminated
前5秒的“手表LS”的输出被示出,然后它终止,因为我发送SIGTERM。
问题:过程如何自杀?我完成了kill(getpid(),SIGTERM);
我的假设: 所以在kill()调用期间,进程切换到内核模式。 kill调用将SIGTERM发送到进程并将其复制到进程的进程表中。当过程回到用户模式时,它会看到表格中的信号并自行终止(如何?我真的不知道) (我想我错了(可能是一个错误)在我的假设的某个地方...所以请赐教)
这段代码实际上是一个存根,我正用它来测试我的项目的其他模块。 它为我做的工作,我很高兴,但我脑海中存在一个问题,实际上一个过程如何杀死自己。我想知道一步一步的假设。
在此先感谢
Anirudh托默
我想它时,它看到了它的进程表SIGTERM信号首先杀死其子进程(完整的树,因为我已经叫killpg()),然后将其调用exit()。
我仍在寻找这个问题的更好的答案。
由于您使用的是killpg()
,因此您的进程死亡,该进程向进程组发送信号,而不是进程。
当你fork()
,孩子继承父亲,其他事情,继承过程组。从man fork
:
* The child's parent process ID is the same as the parent's process ID.
所以你杀了父母和孩子。
如果你做一个简单的kill(getpid(), SIGTERM)
那么父亲会杀死孩子(即watch
ing ls
),然后将和平退出。
所以在kill()调用期间,进程切换到内核模式。 kill调用将SIGTERM发送到进程并将其复制到进程的进程表中。当进程又回到用户模式下,它看到的信号在其表,并自行终止(怎么样?我真的不知道)
在Linux中,从内核模式返回到用户空间模式时,内核检查是否有任何可以传递的未决信号。如果有一些在返回用户空间模式之前传递信号。它也可以在其他时间传递信号,例如,如果某个进程在select()
上被阻塞,然后被终止,或者线程访问未映射的内存位置。
这是超级容易在Perl:
{
local $SIG{TERM} = "IGNORE";
kill TERM => -$$;
}
转换成C就留给读者自己练习。
kill(getpid(), SIGKILL); // itself I think
我与壳体0测试它一个fork
后:和它退出从单独的父进程规则。
我不知道这是一个标准的认证方法....
(我可以从我的psensor工具,在34%的CPU使用率回报像一个正常的程序代码与 计数器停止见) 。
为什么一个进程想要自杀?如果它决定终止,它不会只是调用`exit()`? – 341008 2011-01-08 07:06:48
你是如何杀死那些没有生命的? – 2011-01-08 07:08:50
原因是在上面的情况下,如果你调用exit()而不是kill,那么只有父进程被杀死。子进程变成孤立的,init成为它的新父进程,并且它仍然继续运行。 – Durin 2011-01-08 07:09:48