过程如何自杀?

问题描述:

#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托默

+4

为什么一个进程想要自杀?如果它决定终止,它不会只是调用`exit()`? – 341008 2011-01-08 07:06:48

+0

你是如何杀死那些没有生命的? – 2011-01-08 07:08:50

+0

原因是在上面的情况下,如果你调用exit()而不是kill,那么只有父进程被杀死。子进程变成孤立的,init成为它的新父进程,并且它仍然继续运行。 – Durin 2011-01-08 07:09:48

我想它时,它看到了它的进程表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使用率回报像一个正常的程序代码与 计数器停止见) 。