Como fazer com que os processos não morram depois que seus pais morrem?

2

Eu tenho mexido com forkbombs e notei que se eu apenas fork () processa repetidamente, matar o processo inicial derrubará a árvore inteira. Este não é o caso de forkbombs escritos em BASH usando seu operador de background &, então eu sei que há uma maneira de contornar isso. Como obtenho o mesmo resultado em C?

Eu tenho usado exemplos de forkbomb da Wikipédia: link

    
por Shnatsel 11.10.2013 / 17:56

2 respostas

5

Se você fizer isso em C, precisará fazer um setsid(2) em seu código, além de algumas fork() e exit() chamadas. setsid() tem esse efeito:

... creates a new session if the calling process is not a process group leader. The calling process is the leader of the new session, the process group leader of the new process group, and has no controlling tty.

Isso é da página man. Basicamente, se um processo que é um líder de grupo de processos recebe certos sinais, cada ID de processo nesse grupo de processos recebe o sinal. Você pode ver o mecanismo para isso na página kill(2) man. Se o PID que você chamar kill() on for negativo, o sinal será enviado para todos os processos no grupo de processos.

Você também precisa fork() e exit() nos lugares certos. Basicamente, observe as instruções sobre como se tornar um processo daemon . As partes que você precisa fazer:

switch (fork()) {
case -1: return -1;
case 0:  break;
default: _exit(EXIT_SUCCESS);
}

setsid();

switch (fork()) {
case -1: return -1;
case 0:  break;
default: _exit(EXIT_SUCCESS);
}

Leia sobre como se tornar um processo daemon para mais das razões por trás desse código.

    
por 11.10.2013 / 18:42
2

Existem duas maneiras de criar um plano de fundo e, em seguida, mantê-lo. Se o comando foi iniciado e, em seguida, em segundo plano com & , você pode usar este comando para desconectá-lo do seu terminal.

$ disown -a

Se você quiser isolar o processo do sinal de desligamento (HUP) e também desconectá-lo do terminal (tty), também poderá usar estes comandos:

$ nohup <cmd>

Qualquer saída do console será gravada em um arquivo, nohup.out .

Então eu sugiro que você poderia fazer algo inteligente depois que o processo tiver sido feito em segundo plano com o comando disown -a , seria uma ideia.

Para outras ideias, dê uma olhada na minha resposta a essa pergunta sobre a U & L, intitulada: Onde está o garfo () na bomba do garfo: () {: |: & };:? .

C

Eu daria uma olhada neste tópico do SO, intitulado: C: Exec / fork > Processos extintos , especificamente esta resposta por @Gilles .

    
por 11.10.2013 / 18:13