Так как Вы упоминаете, что использовали /
для поиска я предположу, что Вы используете ключи vi-режима. Значение по умолчанию vi-edit
ключевая таблица не связывает C-u (это связывается с delete-line
в emacs-edit
ключевая таблица).
Можно связать его вручную (например, в Вашем .tmux.conf
, или после <префикса>:
):
bind-key -t vi-edit C-u delete-line
Как работает fork-бомба: в C (или подобный C) код, называют функцию fork()
назван. Это заставляет Linux или Unix или Unix-likes создавать совершенно новый процесс. Этот процесс имеет адресное пространство, идентификатор процесса, маску сигнала, открытые дескрипторы файлов, весь способ вещей, которые занимают место в несколько ограниченной памяти ядра ОС. Недавно созданный процесс также заставляет место в структуре данных ядра для процессов работать. К процессу, который звонил fork()
, похоже, что ничего не произошло. Процесс fork-бомбы попытается звонить fork()
с такой скоростью, как это может, так много раз, как это может.
Прием - то, что недавно созданный процесс также возвращается из fork()
в том же коде. После ветвления у Вас есть два процесса, выполняющие тот же код. Каждый новый процесс fork-бомбы пытается звонить fork()
с такой скоростью, как это может, так много раз, как это может. Код, который Вы дали как пример, является версией сценария Bash fork-бомбы.
Скоро, связанные с процессом ресурсы ядра всей ОС привыкают. Таблица процессов полна. Список ожидания-к-управляемому процессов является полным. Реальная память полна, таким образом, подкачка страниц запускается. Если это продолжается достаточно долго, раздел подкачки заполняется.
На что это похоже пользователю: все работает супер медленно. Вы добираетесь, сообщения об ошибках как "не могли создать процесс" при попытке простых вещей как ls
. Попытка a ps
вызывает бесконечную паузу (если она работает вообще), и отдает очень длинный список процессов. Иногда эта ситуация требует перезагрузки через шнур питания.
Fork-бомбы раньше назывались "кроликами" назад в былые времена. Поскольку они воспроизвели так быстро.
Только для забавы, я записал программу fork-бомбы в C:
#include <stdio.h>
#include <unistd.h>
int
main(int ac, char **av)
{
while (1)
fork();
return 0;
}
Я скомпилировал и запустил ту программу под Дугой Linux в одном xterm. Я другой xterm я пытался получить список процессов:
1004 % ps -fu bediger
zsh: fork failed: resource temporarily unavailable
Оболочка Z в 2-м xterm не могла звонить fork()
успешно, поскольку процессы fork-бомбы, связанные с 1-м xterm, израсходовали все ресурсы ядра, связанные с созданным процессом и выполнение.
Существует много гарантий, которые могут быть помещены на месте, чтобы препятствовать тому, чтобы fork-бомба работала.
Самое простое:
ulimit -u 1024
ограничение количества пользовательских процессов к 1 024.
До обхождения системных гарантий существуют, конечно, способы, которыми можно найти выполнения этого, но я не думаю, что любой здесь даст Вам способ сделать это, но в основном Ваша система исчерпывает PIDs и не может больше порождать процессы и в основном стачивается к полному останову, учитывая, что Ваша бомба берет 100% ЦП, пытающегося порождать больше из себя.
/etc/security/limits.conf
– Karlson
24.04.2012, 00:00
Если Вы ДЕЙСТВИТЕЛЬНО отчаянно пытаетесь видеть, как fork-бомба работает, попытайтесь выполнить ее как корень, например. sudo :(){ :|:& };:
, но снова, быть предупрежденным. Попробованный это самостоятельно на Ubuntu. Система ЗАМОРОЗИТСЯ!
Простое рассечение для Вас:
:() { #Define a new shell function
:|:& #Pipe function named ':' through itself, creating two copies of itself, and make them run in the background
} #End of function definition block
;: #Call the ':' function. Note how the function is defined with two calls to itself piped through each other. This starts a chain reaction: those two copies will in turn create two more, and so on, as infinitum
Знайте об этом при попытке причинить такой вред...
sudo su root
затем выполните fork-бомбу на самом деле как пользователя root.
– sudo
12.03.2018, 22:56
Вы можете сделать это, но убедитесь, что файл называется file.py
import os
while True
os.startfile(file.py)
Затем запустите:
python file.py