#include <unistd.h>
int main(int argc, char* argv[]) {
while(1)
{
fork();
}
}
Я запускаю эту программу на моем Linux, на терминале ничего не выводится, операционная система кажется мертвой. Есть ли у linux какие-либо меры защиты для такой программы, которая может исчерпать память?
Ответы:
Это известно как вилочная бомба .
На самом деле, нет. Каждый форк создает новый процесс с собственным виртуальным адресным пространством и использованием памяти. Таким образом, каждая копия относительно мала. В конце концов, вы израсходуете всю физическую + подкачку памяти в системе, и убийца нехватки памяти (OOM) начнет убивать отдельные процессы. Но вилочная бомба все равно будет создавать процессы так же быстро (если не быстрее).
Одним из способов предотвратить это в первую очередь является ограничение количества пользовательских процессов с помощью
ulimit -u
(при условии, что вы используете Bash; другие оболочки будут иметь эквиваленты).источник
ulimit
это специфично для bash; другие оболочки, вероятно, будут иметь такую же встроенную команду, но, возможно, с другим именем.Да, хотя он может быть не включен по умолчанию в вашей системе.
setrlimit
Системный вызов определяет системные ограничения - в том числе количества процессов для каждого пользователя.Давайте сначала посмотрим на это в API ядра (поскольку вы упомянули «linux»): вы можете использовать man-страницу для setrlimit, которая скажет вам сделать что-то вроде
Это установит максимальное количество процессов для пользователя (
RLIMIT_NPROC
) в 40 (мягкое ограничение) и 50 (жесткое ограничение).Теперь из оболочки, если вы используете bash, вы можете использовать
ulimit
встроенную команду:Вы можете установить ограничение, передав его в качестве аргумента:
ulimit --help
покажет вам, что есть несколько других ограничений, которые вы можете установить (одно из которых может представлять интерес - максимальное количество файловых дескрипторов, используемых пользователем).источник
Это зависит от того, хотите ли вы использовать его на уровне пользователя или системы. На уровне пользователя
ulimit
(или соответствующие команды для других оболочек) было бы самым простым решением.Однако на системном уровне существуют механизмы, предотвращающие остановку системы злоумышленниками (или просто не использующими ulimit). Механизм Linux cgroups может ограничивать ресурсы для каждой группы. Вы можете заставить (по
pam_systemd
механизму) сеанс пользователя быть в определенной группе. Это имеет и другие преимущества, например, для планировщика ЦП.источник
/sys/fs/cgroup/
2. путем поиска в google 3. путем просмотраmake menuconfig
4. путем просмотра/usr/src/linux/Documentation/cgroups
5. путем чтения документации systemd. Извините, я не могу помочь больше, но я использовал только эти ресурсы. Я использовал cgroups на рабочем столе для управления ресурсами.Используйте
ulimit -u
из оболочки bash, чтобы установить ограничение на «максимальное количество пользовательских процессов».Из оболочки C вы используете
limit
команду.Если вам нужен системный вызов для этого, используйте
setrlimit
вызов для установкиRLIMIT_NPROC
.источник
Поскольку самым последним ответам здесь уже более 3 лет, я хочу отметить, что более новые ядра (начиная с 4.3) имеют явную поддержку для предотвращения разветвления бомб через новую «подсистему PID». (См. Https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=49b786ea146f69c371df18e81ce0a2d5839f865c и https://git.kernel.org/cgit/linux/kernel/git /torvalds/linux.git/commit/?id=917d8e2d10f40e28aa9e0d824b2e5b8197d79fc2 )
источник