Подтвердить что ты не робот

Почему C-forkbombs не работают как bash?

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

:(){ :&:&};:

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

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

#include <unistd.h>

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

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


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

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

4b9b3361

Ответ 1

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

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

Ответ 2

В вашей bash forkbomb вы добавляете новые процессы в новые группы фонового процесса, поэтому вы не сможете их ^C.

Ответ 3

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

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

Ответ 4

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