为什么C-forkbombs不能像bash那样工作?

如果我运行古典bash forkbomb:

:(){ :&:&};: 

我的系统在几秒钟后挂起

我试图在C中写一个forkbomb,这里是代码:

 #include <unistd.h> int main( ) { while(1) { fork(); } return 0; } 

当我运行它时,系统的响应速度会变慢,但是我可以按^C来杀死这个进程(即使在几分钟之后)。


上面的代码与我发布的原始bash forkbomb不同:它更像是:

 :( ) { while true do : done } 

(我没有testing,不知道是否会挂起系统)。

所以我也试图实现原来的版本; 这里的代码是:

 #include <unistd.h> inline void colon( const char *path ) { pid_t pid = fork( ); if( pid == 0 ) { execl( path, path, 0 ); } } int main( int argc, char **argv ) { colon( argv[0] ); colon( argv[0] ); return 0; } 

但仍然没有什么:我可以运行它,然后轻松杀死它。 这不是我的系统。


为什么?

bash forkbombs有什么特别之处? 是因为bash使用更多的内存/ CPU? 因为bash进程比我的调用更多的系统调用(例如,访问文件系统)?

C程序很小 ,非常小。 此外,fork()这样的程序是非常非常高效的。 然而,像Bash这样的解释器在内存使用方面要贵得多,而且需要随时访问磁盘。

尝试运行它更长的时间。 🙂

在您的bash forkbomb中,您正在将新进程置于新的后台进程组中,因此您将无法使用它们。

真正的原因是在BASH中你创build的过程是从父进程中分离出来的。 如果父进程(最初启动的进程)被终止,则其余进程将继续运行。 但是在C语言实现中,如果父进程被终止,那么subprocess就会死掉,所以这样做足以拖延最初的进程,从而开始拖延整个进程的树状结构。

我还没有拿出一个C forkbomb实现,分离subprocess,以便他们不会死亡,如果父母死亡。 链接到这样的实现将不胜感激。

这基本上是因为大小。 当你运行bash fork炸弹时,它将大型怪兽程序加载到内存中(相对于你的c程序),它们中的每一个都开始占用你的cpu资源。无限期地,当大怪物开始重现麻烦时,比蜜蜂开始做同样的事情更快。 所以电脑立即挂起。但是,如果你让你的c可执行文件长时间运行,它也会挂起系统。只是时间会多得多。 如果你想比较bash的大小和c程序的大小,请检查/ proc //状态。 首先用任何正在运行的bash实例的pid,然后用任何正在运行的ac程序实例的pid