#include <unistd.h>
int main(int argc, char* argv[]) {
while(1)
{
fork();
}
}
Ejecuto este programa en mi Linux, no sale nada en el terminal, el sistema operativo parece estar muerto. ¿Tiene Linux alguna medida de protección para dicho programa que pueda quedarse sin memoria?
Respuestas:
Esto se conoce como una bomba tenedor .
Realmente no. Cada bifurcación produce un nuevo proceso, con su propio espacio de direcciones virtuales y uso de memoria. Entonces cada copia es relativamente pequeña. Eventualmente, usará toda la memoria física + de intercambio en el sistema, y el asesino de falta de memoria (OOM) comenzará a matar procesos individuales. Pero la bomba tenedor seguirá creando procesos igual de rápido (si no más rápido).
En primer lugar, una forma de evitar que esto ocurra es limitar el número de procesos de usuario, utilizando
ulimit -u
(suponiendo que esté utilizando Bash; otros shells tendrán equivalentes).fuente
ulimit
es específico de bash; otros shells probablemente tendrán el mismo comando incorporado, pero quizás con un nombre diferente.Sí, aunque es posible que no esté habilitado de forma predeterminada en su sistema. La
setrlimit
llamada al sistema define los límites del sistema, incluido el número de procesos por usuario.Miremos primero en la API del núcleo (ya que mencionó "linux"): puede usar la página de manual para setrlimit, que le indicará que haga algo como
Esto establecerá los procesos máximos por usuario (
RLIMIT_NPROC
) en 40 (límite flexible) y 50 (límite rígido).Ahora, desde el shell, si usa bash, puede usar el
ulimit
comando incorporado:Puede establecer el límite pasándolo como argumento:
ulimit --help
le mostrará que hay varios otros límites que puede establecer (uno que puede ser de interés es el número máximo de descriptores de archivo utilizados por el usuario).fuente
Depende si desea usarlo a nivel de usuario o de sistema. En el nivel de usuario,
ulimit
(o los comandos correspondientes para otros shells) serían la solución más fácil.Sin embargo, a nivel del sistema, existen mecanismos para evitar que usuarios malintencionados (o simplemente no usen ulimit) detengan el sistema. El mecanismo de cgroups de Linux puede limitar los recursos por grupo. Puede forzar (por
pam_systemd
macanismo) que la sesión del usuario esté en un grupo específico. Esto tiene otros beneficios para, por ejemplo, el planificador de CPU.fuente
/sys/fs/cgroup/
2. buscando en google 3. navegando a través demake menuconfig
4. Al examinar/usr/src/linux/Documentation/cgroups
5. Al leer la documentación de systemd. Lo siento, no puedo ayudar más, pero usé solo esos recursos. Usé cgroups en el escritorio para controlar los recursos.Úselo
ulimit -u
desde el shell bash para establecer un límite en "procesos de usuario máximos".Desde el shell C, usa el
limit
comando.Si necesita una llamada al sistema para hacer esto, use la
setrlimit
llamada para configurarRLIMIT_NPROC
.fuente
Dado que las respuestas más recientes aquí tienen más de 3 años, quiero señalar que los Kernels más nuevos (desde 4.3) tienen un soporte explícito para evitar bombas de horquilla a través del nuevo "subsistema PID". (Ver https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=49b786ea146f69c371df18e81ce0a2d5839f865c y https://git.kernel.org/cgit/linux/kernel/git /torvalds/linux.git/commit/?id=917d8e2d10f40e28aa9e0d824b2e5b8197d79fc2 )
fuente