O que você pede é simplesmente impossível. Pelo design do gerenciamento interno de processos Unix e Linux, o init
se torna o pai de todos os processos cujos pais morrem. Isso ocorre porque os processos devem ter pais (também por design), e o init sempre está lá, pois se init
morre, o sistema é encerrado. Mas além disso, não existem processos de "re-paternidade".
EDITAR
No entanto: Como lord.garbage apontou, há a chamada de sistema arcano prctl()
, que é legal e faz com que qualquer programa que a use não seja portável. Suponha que não nos importamos. Usando a opção PR_SET_CHILD_SUBREAPER
, ela pode wait()
não apenas para seus próprios filhos (como antes), mas também para todos os seus descendentes, caso seus pais morram prematuramente. Assim, um processo usando esse recurso pode assumir o papel de init
para seus descendentes. O código a seguir é uma prova de conceito:
#include <sys/prctl.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
int
main (int argc, const char* const argv[], char* const envp[])
{
pid_t pid;
if (prctl(PR_SET_CHILD_SUBREAPER, 1, 0, 0, 0) < 0) {
perror("prctl");
return 4;
}
pid = fork();
if (pid < 0) {
perror("fork");
return 4;
}
if (pid == 0) {
// child
char* const argv[] = { "/usr/bin/konsole", "-e", "/bin/bash", NULL };
if (execve("/usr/bin/konsole", argv, envp) < 0) {
perror("execve");
}
}
// parent
while (1) {
pid_t wpid;
int s;
wpid = waitpid(-1, &s, 0);
if (wpid > 0) {
printf("child with pid %u has exited\n", wpid);
}
}
return 0;
}
Execute alguns programas em segundo plano que não precisam de atendimento ao shell, saia do konsole, execute ps
, saia dos programas e veja o que acontece. Substitua konsole
por qualquer coisa que seu coração desejar.
Agora, para alcançar o que você deseja, use a chamada prctl()
como no PoC e, em seguida, execve()
to dwm
. E espero que dwm
wait()
s para crianças inespecíficas para que não acabem como zumbis.
Nota final: Ainda não existe o parentesco. Ou seja você ainda não pode atribuir arbitrariamente um pai a um processo.