不确定的C行为?"叉炸弹"

时间:2017-02-02 18:30:50

标签: c fork kill

所以我创建了一个" fork"炸弹每说。然而,当我在我的计算机上运行它时,它会杀死我的计算机上的所有内容,然后转到黑屏然后恢复自己。

在我的朋友计算机上运行相同的代码时,他实际上做了一个分叉炸弹但从未进入杀死循环。

有什么理由?

#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
int main(){

    int pc = 0;
    int* pids = calloc(1025,sizeof(int));
    L1:
        while(1){
            int pid = fork();
            if(pid != 0)
            {
                pc++;
                pids[pc] = pid;

            }

            if(pc == 1024)
            {
                goto L2;
                break;
            }
        }
    L2:
        while(1){
            if(pids[pc] != 0) {
                kill(pids[pc],SIGKILL);
            }

            if(pc == 0)
            {
                goto L1;
                break;
            }

            pc--;
        }
    free(pids);
}

请注意,此代码仅适用于funsies。

更新

放入pc ++。在if语句之外引起内核恐慌。有人可以向我解释原因吗?

理论上,这段代码甚至不起作用。

2 个答案:

答案 0 :(得分:2)

您可能崩溃的原因是fork()可能失败,在这种情况下它将返回-1。当您致电kill(-1, SIGKILL)时,它会将SIGKILL发送到您系统上的每个进程。如果您是以特权用户身份运行,那么这个可怕的原因应该是显而易见的。

附注:

  1. fork()的返回类型为pid_t不是 int。在大多数情况下,pid_t恰好适合int,但您应该使用正确的类型。

  2. break语句后有一个goto语句是没有意义的。 <{1}}永远无法到达。

  3. 如果您在编译器上启用了警告,它可能会告诉您这两个警告。

答案 1 :(得分:1)

"fork bomb"就其本质而言,不具有任何确定性行为。理论上,具有无限资源的计算机可以毫无问题地继续分叉。 但实际上,我们知道计算机没有无限的资源。因此,不同的操作系统可能以不同的方式处理资源消耗。

通常,当操作系统无法生成进一步的进程时,内核可能会终止“违规”进程,以释放资源或崩溃或陷入困境。即使内核识别出来,进程的指数级增长通常也难以处理。

所以,你不能指望任何确定性或可重复的行为。