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

Shn*_*sel 2 process c process-management fork

我一直在搞乱 forkbombs 并注意到如果我只是重复 fork() 进程,杀死初始进程将破坏整个树。对于使用 BASH 使用其后台操作符 & 编写的 forkbombs,情况并非如此,所以我知道有一种方法可以解决这个问题。如何在 C 中实现相同的结果?

我一直在使用维基百科中的 forkbomb 示例:http : //en.wikipedia.org/wiki/Fork_bomb#Example_fork_bombs

Bru*_*ger 5

如果您在 C 中执行此操作,则需要setsid(2)在代码中执行 a以及一些fork()exit()调用。 setsid()有这个效果:

... 如果调用进程不是进程组领导,则创建一个新会话。调用进程是新会话的leader,新进程组的进程组leader,没有控制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);
}
Run Code Online (Sandbox Code Playgroud)

阅读有关成为守护进程的更多信息,了解此代码背后的原理。