Linux 进程如何自杀?

Linux 进程如何自杀?,linux,process,kill,signal-handling,sigterm,Linux,Process,Kill,Signal Handling,Sigterm,在前5秒,显示“watch ls”的输出,然后它终止,因为我发送了一个SIGTERM 问题:进程如何自杀?我已经完成了kill(getpid(),SIGTERM) 我的假设: 因此,在kill()调用期间,进程将切换到内核模式。kill调用将SIGTERM发送到进程,并将其复制到进程的进程表中。当进程返回到用户模式时,它会在表中看到信号,并自行终止(如何终止?我真的不知道) (我认为我的假设中有错(可能是一个错误)……所以请启发我) 这段代码实际上是一个存根,我正在使用它来测试项目的其他模块。

在前5秒,显示“watch ls”的输出,然后它终止,因为我发送了一个SIGTERM

问题:进程如何自杀?我已经完成了kill(getpid(),SIGTERM)

我的假设: 因此,在kill()调用期间,进程将切换到内核模式。kill调用将SIGTERM发送到进程,并将其复制到进程的进程表中。当进程返回到用户模式时,它会在表中看到信号,并自行终止(如何终止?我真的不知道) (我认为我的假设中有错(可能是一个错误)……所以请启发我)

这段代码实际上是一个存根,我正在使用它来测试项目的其他模块。 它为我做了这项工作,我对此感到高兴,但我心里有一个问题:一个过程究竟是如何自杀的。我想知道一步一步的假设

提前谢谢


Anirudh Tomer

我认为,当它在进程表中看到SIGTERM信号时,它首先杀死它的子进程(完成树,因为我调用了killpg()),然后调用exit()


我仍然在寻找这个问题的更好答案。

我认为当它在进程表中看到SIGTERM信号时,它首先杀死它的子进程(完成树,因为我调用了killpg()),然后调用exit()


我仍在寻找这个问题的更好答案。

您的进程将终止,因为您使用的是
killpg()
,它向进程组而不是进程发送信号

当您使用
fork()
时,子进程将从父进程组继承。从
人叉

anirudh@anirudh-Aspire-5920:~/Desktop/testing$ gcc test.c
anirudh@anirudh-Aspire-5920:~/Desktop/testing$ ./a.out
Terminated
所以你杀了父母和孩子


如果您执行一个简单的
kill(getpid(),SIGTERM)
,那么父亲将杀死孩子(即
watch
ing
ls
),然后将和平退出。

您的进程死亡,因为您使用的是
killpg()
,它向进程组而不是进程发送信号

当您使用
fork()
时,子进程将从父进程组继承。从
人叉

anirudh@anirudh-Aspire-5920:~/Desktop/testing$ gcc test.c
anirudh@anirudh-Aspire-5920:~/Desktop/testing$ ./a.out
Terminated
所以你杀了父母和孩子

如果你做一个简单的
杀死(getpid(),SIGTERM)
,那么父亲会杀死孩子(也就是
watch
ing
ls
),然后和平退出

因此,在kill()调用期间,进程将切换到内核模式。kill调用将SIGTERM发送到进程,并将其复制到进程的进程表中。当进程返回到用户模式时,它会在表中看到信号,并自行终止(如何终止?我真的不知道)

在Linux中,当从内核模式返回到用户空间模式时,内核会检查是否有任何可以传递的挂起信号。如果有的话,它会在返回用户空间模式之前发送信号。它还可以在其他时间发送信号,例如,如果进程在
select()
上被阻止,然后被终止,或者线程访问未映射的内存位置时

因此,在kill()调用期间,进程将切换到内核模式。kill调用将SIGTERM发送到进程,并将其复制到进程的进程表中。当进程返回到用户模式时,它会在表中看到信号,并自行终止(如何终止?我真的不知道)


在Linux中,当从内核模式返回到用户空间模式时,内核会检查是否有任何可以传递的挂起信号。如果有的话,它会在返回用户空间模式之前发送信号。它还可以在其他时间发送信号,例如,如果进程在
select()
上被阻塞,然后被终止,或者线程访问未映射的内存位置。

这在Perl中非常容易:

   *  The child's parent process ID is the same as the parent's process ID.

将转换为C留给读者作为练习。

这在Perl中非常容易:

   *  The child's parent process ID is the same as the parent's process ID.
   { 
        local $SIG{TERM} = "IGNORE";
        kill TERM => -$$;
   }
转换成C语言留给读者作为练习

   { 
        local $SIG{TERM} = "IGNORE";
        kill TERM => -$$;
   }
我在使用案例0执行
fork
之后对其进行了测试:它从单独的父进程中退出常规

我不知道这是否是一个标准的认证方法

(我可以从我的psensor工具中看到,CPU使用率以34%的速度返回,就像正常的程序代码一样 一个柜台停了下来)

我在使用案例0执行
fork
之后对其进行了测试:它从单独的父进程中退出常规

我不知道这是否是一个标准的认证方法

(我可以从我的psensor工具中看到,CPU使用率以34%的速度返回,就像正常的程序代码一样
计数器已停止)。

进程为什么要自杀?如果它决定终止,它是否只调用
exit()
?如何杀死没有生命的进程???原因是在上述情况下,如果你调用exit()而不是kill,那么只有父进程被杀死。子进程成为孤立进程,init成为它的新父进程,并且它仍在运行。我希望终止整个进程树。如果我使用killpg(pid,SIGTERM),它对我来说不起作用,它只杀死一个子函数,并且“system()”函数的进程继续运行。我试着做killpg(getpid(),SIGTERM),它帮了我的忙。但问题是这怎么可能?也许你应该编辑你的问题,询问如何杀死整个进程树,因为这似乎是你真正想要的。为什么一个进程想要杀死自己?如果它决定终止,它是否只调用
exit()
?如何杀死没有生命的进程???原因是在上述情况下,如果你调用exit()而不是kill,那么只有父进程被杀死。子进程成为孤立进程,init成为它的新父进程,并且它仍在运行。我希望终止整个进程树。如果我使用killpg(pid,SIGTERM),它对我来说不起作用,它只杀死一个子函数,并且“system()”函数的进程继续运行。我尝试