gpt4 book ai didi

c - 不确定的 C 行为 ?"Fork bomb"

转载 作者:太空宇宙 更新时间:2023-11-04 06:57:44 25 4
gpt4 key购买 nike

所以我为每个人制造了一个“ fork ”炸弹。然而,当我在我的电脑上运行它时,它会杀死我电脑上的所有东西,进入黑屏然后自行恢复。

在我 friend 的计算机上运行完全相同的代码时,他实际上做了一个 fork 炸弹,但从未进入 kill loop。

有什么原因吗?

#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);
}

注意这段代码只是为了好玩。

更新:

将 pc++。在 if 语句之外导致内核 panic 。有人可以向我解释为什么吗?

理论上这段代码根本行不通。

最佳答案

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

旁注:

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

  2. goto 语句之后有一个 break 语句是没有意义的。永远无法到达中断

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

关于c - 不确定的 C 行为 ?"Fork bomb",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42009742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com