Não é portável, mas o Linux permite não- init
de reparos de processos, veja PR_SET_CHILD_SUBREAPER
em prctl (2) .
PR_SET_CHILD_SUBREAPER
(since Linux 3.4)
If arg2 is nonzero,
set the "child subreaper" attribute of the calling process;
if arg2 is zero, unset the attribute.
When a process is marked as a child subreaper,
all of the children that it creates, and their descendants,
will be marked as having a subreaper.
In effect,
a subreaper fulfills the role of init(1) for its descendant processes.
…
No entanto, seu subperme também pode morrer (acidentalmente). Outra opção, novamente no Linux, pode ser um namespace ou contêiner PID. A solução mais comum é tornar o processo pai o mais simples e robusto possível, de modo que seja menos provável que ele seja expulso ou morra.
Mais complicado seria vincular os processos filhos ao pai, embora isso não seja possível se o filho processar algo do executivo ou se os processos filhos não puderem ser complicados com E / S assíncrona, pois a criança terá que verificar o pipe para que o EOF perceba que o pai foi embora:
#include <err.h>
#include <errno.h>
#include <unistd.h>
int main(void)
{
int fd[2];
char ch;
ssize_t ret;
pipe(fd);
switch (fork()) {
case -1:
err(1, "fork failed");
case 0:
close(fd[1]);
warnx("child %d start", getpid());
/* this would really need to be done in an event loop so the
* child can do other things meanwhile */
ret = read(fd[0], &ch, 1);
if (ret == 0)
errx(1, "EOF from parent (child %d)", getpid());
break;
default:
/* and another child process... */
switch (fork()) {
case -1:
err(1, "fork failed");
case 0:
close(fd[1]);
warnx("child %d start", getpid());
ret = read(fd[0], &ch, 1);
if (ret == 0)
errx(1, "EOF from parent (child %d)", getpid());
break;
default:
sleep(9);
}
}
return 0;
}