【发布时间】:2017-12-09 23:18:40
【问题描述】:
在我的一门 CS 课程中,我们的任务是制造一个很难阻止的叉形炸弹。
需要免疫control-c、control-z、control-d关闭终端。它还必须不受 sigkill 和信号 9 的影响,我们很快就使用 sigsegv 进行了信号处理,但仅此而已。我读到 sigaction 无法捕获 sigkill 或 sigstop 信号。
我还读到,守护进程将允许它在后台运行,因此关闭终端不会停止它。
如何使 fork 炸弹进程对 sigkill 信号免疫?
这是我们之前制作的叉子炸弹。
#include<unistd.h>
int main(){
while(1){
fork();
}
return 0;
}
我也在使用虚拟盒子来安全地测试它。
【问题讨论】:
-
你不能让进程对 SIGKILL 信号免疫;这总是致命的。但是,您可以做的是确保即使启动 fork 炸弹的原始进程因 SIGKILL 而死,它的众多后代也不会收到该信号,因此将继续产生子进程,并使您的系统像允许您同时运行的进程数的限制将允许。我不建议尝试 - 您可能需要重新启动。 (过程组和会话将是相关的。)
-
我正在使用虚拟盒子测试炸弹,如何让子进程收不到SIGKILL?
-
你不能让任何进程不接收来自适当授权进程的 SIGKILL(例如,由
root运行的进程)。如果子进程设法从创建它的用户更改其身份(例如,因为它是另一个用户的 SUID),那么它可能会获得某种免疫。但是,如果root设法启动一个向它发送 SIGKILL 的进程,该进程将突然死亡,并且没有任何缓和选项。唯一失败的情况是进程挂在不可中断的系统调用中——这偶尔会发生在不可用的 NFS 文件系统上(但更早),但是……
标签: c linux signals fork daemon