我一直在摆弄 forkbombs,并注意到如果我只是重复 fork() 进程,杀死初始进程将导致整个树崩溃。对于使用 BASH 的后台运算符 & 编写的 forkbomb 来说,情况并非如此,所以我知道有一种方法可以解决这个问题。如何在 C 语言中获得相同的结果?
我一直在使用维基百科中的 forkbomb 示例:http://en.wikipedia.org/wiki/Fork_bomb#Example_fork_bombs
答案1
如果您在 C 中执行此操作,则需要setsid(2)
在代码中执行 a 以及一些fork()
andexit()
调用。 setsid()
有这样的效果:
...如果调用进程不是进程组领导者,则创建一个新会话。调用进程是新会话的领导者、新进程组的进程组领导者,并且没有控制tty。
这是来自手册页的内容。基本上,如果作为进程组领导者的进程收到某些信号,则该进程组中的每个进程 ID 都会收到该信号。您可以在手册页中查看此机制kill(2)
。如果您调用的 PIDkill()
为负,则信号将发送到进程组中的每个进程。
fork()
你还需要exit()
在正确的地方。基本上看一下有关如何成为守护进程的说明。您需要做的部分:
switch (fork()) {
case -1: return -1;
case 0: break;
default: _exit(EXIT_SUCCESS);
}
setsid();
switch (fork()) {
case -1: return -1;
case 0: break;
default: _exit(EXIT_SUCCESS);
}
阅读有关成为守护进程的信息,了解此代码背后的更多基本原理。
答案2
有两种方法可以将进程设置为后台并继续运行。如果该命令已启动然后在后台运行,&
您可以使用此命令将其与终端断开连接。
$ disown -a
如果您想让进程与挂断信号 (HUP) 隔离,并断开它与终端 (tty) 的连接,您也可以使用以下命令:
$ nohup <cmd>
任何控制台输出都将写入文件nohup.out
.
因此,我建议您可以在使用disown -a
命令将进程置于后台后做一些聪明的事情,这将是一个想法。
对于其他想法,请查看我对此 U&L 问题的回答,标题为:叉子炸弹上的 fork() 在哪里:(){ :|: & };:?。
C
我会看一下 SO 的这个帖子,标题为:C: Exec/fork > 失效进程,具体来说这个答案是@吉尔斯。