Linux 进程如何自杀?
在前5秒,显示“watch ls”的输出,然后它终止,因为我发送了一个SIGTERM 问题:进程如何自杀?我已经完成了kill(getpid(),SIGTERM) 我的假设: 因此,在kill()调用期间,进程将切换到内核模式。kill调用将SIGTERM发送到进程,并将其复制到进程的进程表中。当进程返回到用户模式时,它会在表中看到信号,并自行终止(如何终止?我真的不知道) (我认为我的假设中有错(可能是一个错误)……所以请启发我) 这段代码实际上是一个存根,我正在使用它来测试项目的其他模块。 它为我做了这项工作,我对此感到高兴,但我心里有一个问题:一个过程究竟是如何自杀的。我想知道一步一步的假设 提前谢谢Linux 进程如何自杀?,linux,process,kill,signal-handling,sigterm,Linux,Process,Kill,Signal Handling,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
ingls
),然后将和平退出。您的进程死亡,因为您使用的是killpg()
,它向进程组而不是进程发送信号
当您使用fork()
时,子进程将从父进程组继承。从人叉
:
anirudh@anirudh-Aspire-5920:~/Desktop/testing$ gcc test.c
anirudh@anirudh-Aspire-5920:~/Desktop/testing$ ./a.out
Terminated
所以你杀了父母和孩子
如果你做一个简单的杀死(getpid(),SIGTERM)
,那么父亲会杀死孩子(也就是watch
ingls
),然后和平退出
因此,在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()”函数的进程继续运行。我尝试