O linux tem alguma medida para se proteger contra garfos?


12
#include <unistd.h>
int main(int argc, char* argv[]) {
  while(1)
  {
    fork();
  } 
}

Eu corro este programa no meu linux, nada sai no terminal, o sistema operacional parece ir morto. O linux tem alguma medida de proteção para esse programa que pode ficar sem memória?


2
Eu suspeito que o impacto seria bem menor se você não seguisse os maus conselhos que muitas distros dão para criar uma grande partição de troca ...
R .. GitHub PARE DE AJUDAR O GELO

1
"Não criar novos processos depois de atingir 65k" conta como contra-medida? ;)
Bobby

Respostas:


18

Isso é conhecido como bomba de forquilha .

O linux tem alguma medida de proteção para esse programa que pode ficar sem memória?

Na verdade não. Cada fork produz um novo processo, com seu próprio espaço de endereço virtual e uso de memória. Portanto, cada cópia é relativamente pequena. Eventualmente, você usará toda a memória física + swap no sistema, e o killer de falta de memória (OOM) começará a matar processos individuais. Mas a bomba de garfo ainda estará criando processos com a mesma rapidez (se não mais rápido).

Uma maneira de impedir que isso ocorra em primeiro lugar é limitar o número de processos do usuário, usando ulimit -u(supondo que você esteja usando o Bash; outros shells terão equivalentes).


2
Uma coisa a notar é que ulimité específico ao bash; outros shells provavelmente terão o mesmo comando interno, mas talvez com um nome diferente.
21712 Jay

@ Jay: ponto justo. Notei que na resposta agora, obrigado!
Oliver Charlesworth

1
limitar os descritores de memória / arquivo por usuário deve ser suficiente. Limitar a memória por usuário é sempre uma boa ideia. Quando um processo é morto (oom), o cão de guarda deve enviar uma notificação para que o BOFH poderia arrancar 'o ladino' user w / todos os processos pertencentes fora do sistema

Eu acredito que você também pode definir alguns limites através de parâmetros de login
p_l

10

Sim, embora possa não estar ativado por padrão no seu sistema. A setrlimitchamada do sistema define os limites do sistema - incluindo o número de processos por usuário.

Vamos dar uma olhada primeiro na API do kernel (desde que você mencionou "linux"): você pode usar a página de manual do setrlimit, que solicitará que você faça algo como

#include <sys/resource.h>
...

struct rlimit  r;

rnew.r_cur = 40;
rnew.r_max = 50;
setrlimit(RLIMIT_NPROC,&r);

Isso definirá o número máximo de processos por usuário ( RLIMIT_NPROC) para 40 (limite flexível) e 50 (limite rígido).

Agora, a partir do shell, se você usar o bash, poderá usar o ulimitcomando interno:

ulimit -u
29089

Você pode definir o limite passando-o como argumento:

ulimit -u 100

ulimit --help mostrará que existem vários outros limites que você pode definir (um que pode ser interessante é o número máximo de descritores de arquivos usados ​​pelo usuário).


7

Depende se você deseja usá-lo no nível do usuário ou do sistema. No nível do usuário, ulimit(ou comandos correspondentes para outros shells) seria a solução mais fácil.

No entanto, no nível do sistema, existem mecanismos para impedir que usuários mal-intencionados (ou simplesmente não usem ulimit) parem o sistema. O mecanismo cgroups do Linux pode limitar os recursos por grupo. Você pode forçar (por pam_systemdmachanismo) a sessão do usuário a estar em um grupo específico. Isso tem outros benefícios, por exemplo, no agendador da CPU.


1
+1: cgroups são realmente novos e a maioria das pessoas ainda não sabe muito sobre eles. Onde podemos aprender mais?
Ken Bloom

1
@KenBloom: 1. navegando /sys/fs/cgroup/2. pesquisando no google 3. navegando através de make menuconfig4. Observando /usr/src/linux/Documentation/cgroups5. lendo a documentação do systemd. Desculpe, não posso ajudar mais, mas usei apenas esses recursos. Eu usei o cgroups na área de trabalho para controlar os recursos.
Maciej Piechotka

6

Use ulimit -uno shell bash para definir um limite para "processos máximos de usuários".

No shell C, você usa o limitcomando

Se você precisar de uma chamada do sistema para fazer isso, use a setrlimitchamada para definir RLIMIT_NPROC.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.