如何使进程在其父进程死亡后不死亡?

如何使进程在其父进程死亡后不死亡?

我一直在摆弄 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 > 失效进程,具体来说这个答案是@吉尔斯

相关内容