Пакетная форк-бомба?

Я смотрел на форк-бомбу в Википедии, и примеры пакетов были:

%0|%0

OR

:here
start ''your fork bomb name''.bat
goto here

OR

:here
start %0
goto here

Вторые два я понимаю, они запускают другой экземпляр себя, а затем повторяются, но я не понимаю первого. Я читал, что конвейер выполняет файл справа с выводом файла слева. Почему форк-бомба не может быть просто:

%0

Я бы предположил, что это вызовет само себя, но затем мгновенно завершится, но почему бы %0|%0 также не завершиться? Несмотря на то, что новый экземпляр будет продолжать создавать новые экземпляры, разве первый не выполняется после запуска второго? Что заставляет продолжаться первый?

редактировать: это зацикливается, потому что ни один из экземпляров не может завершиться, пока их рекурсивный вызов не будет возвращен? Означает ли это, что он вызывает только первый %0?


person mowwwalker    schedule 20.01.2012    source источник


Ответы (1)


%0 никогда не закончится, но он никогда не создает более одного процесса, потому что он мгновенно передает управление второму пакетному сценарию (которым оказывается он сам).

Но конвейер Windows создает новый процесс для каждой стороны канала в дополнение к родительскому процессу. Родительский процесс не может завершиться, пока не завершится каждая сторона канала. Таким образом, основная программа с простым каналом будет иметь 3 процесса. Вы можете видеть, как быстро бомба выходит из-под контроля, если каждая сторона конвейера рекурсивно вызывает родительский пакет!

person dbenham    schedule 21.01.2012
comment
Как вызывается вторая часть канала, если первый рекурсивный вызов никогда не возвращается? - person mowwwalker; 21.01.2012
comment
Две стороны работают асинхронно - person dbenham; 21.01.2012
comment
Мне сказали, что конвейер вызывает вторую половину с возвратом первой половины: csie.ntu.edu.tw/~r92092/ref/win32/ - person mowwwalker; 21.01.2012
comment
Здесь есть хорошая информация об асинхронном характере каналов Windows: stackoverflow.com/a/8194279/1012053 - person dbenham; 21.01.2012