Почему c-forkbombs не работают, такие как bash и близких?


если я запускаю классическую bash forkbomb:

:(){ :&:&};:

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

Я пытался написать forkbomb в C, вот код:

#include <unistd.h>

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

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


приведенный выше код отличается от оригинального bash forkbomb, который я опубликовал: это что-то вроде:

:( )
{
    while true
    do
        :
    done
}

(I не проверял его; не знаю, если бы это было зависание система).

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

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

4   51  

4 ответа:

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

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

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

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

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

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