Почему C-forkbom не работают как bash? - PullRequest
51 голосов
/ 22 ноября 2010

Если я запускаю классическую вилочную бомбу bash:

:(){ :&:&};:

моя система через несколько секунд зависает .

Я пытался написать вилочную бомбу на C, здесьэто код:

#include <unistd.h>

int main( )
{
    while(1) {
        fork();
    }
    return 0;
}

Когда я запускаю его, система становится менее отзывчивой, но я могу убить этот процесс (даже через несколько минут), просто нажав ^C.


.Приведенный выше код отличается от исходной бомбы-бомбы bash, которую я написал: это что-то вроде:

:( )
{
    while true
    do
        :
    done
}

(я не проверял это; не знаю, будет ли это зависать )система).

Поэтому я также попытался реализовать оригинальную версию;здесь код:

#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-вилочных бомбах?Это потому, что bash использует намного больше памяти / процессора?Поскольку процессы bash вызывают намного больше системных вызовов (например, для доступа к файловой системе), чем мои?

Ответы [ 4 ]

44 голосов
/ 22 ноября 2010

Эта программа на C крошечная , серьезно крошечная.Кроме того, fork () с такой программой очень и очень эффективна.Однако интерпретатор, такой как Bash, намного дороже с точки зрения использования оперативной памяти и требует постоянного доступа к диску.

Попробуйте запустить его гораздо дольше.:)

4 голосов
/ 11 октября 2013

Причина real в том, что в BASH создаваемый вами процесс отделен от родительского. Если родительский процесс (тот, который вы изначально запустили) завершается, остальные процессы продолжают работать. Но в реализациях C, которые вы перечислили, дочерние процессы умирают, если родительский процесс убит, поэтому достаточно разрушить начальный процесс, который вы начали, чтобы разрушить целое дерево вечно разветвляющихся процессов.

Я еще не придумал реализацию C forkbomb, которая отсоединяет дочерние процессы, чтобы они не уничтожались, если родительский процесс умирает. Ссылки на такие реализации приветствуются.

3 голосов
/ 13 ноября 2011

В своей bash-форке вы помещаете новые процессы в новые группы фоновых процессов, поэтому вы не сможете ^C их.

0 голосов
/ 06 декабря 2011

Это в основном из-за размера. Когда вы запускаете бомбу bash fork, она загружает в память большие программы монстров (по отношению к вашей программе c), каждая из которых начинает загружать ресурсы вашего процессора. Определенно, когда большие монстры начинают воспроизводить, проблемы возникают быстрее, чем если бы пчелы начали делать то же самое. , Таким образом, компьютер зависает немедленно. Однако, если вы продолжите работать с исполняемым файлом c, он тоже будет зависать. Просто время будет намного больше. Если вы хотите сравнить размер bash с размером c программы, проверьте / proc // status. сначала с pid любого работающего экземпляра bash, а затем с pid любого работающего экземпляра программы c

...