シグナルハンドラでブロックすることなく、すべての子と孫が終了するまでどのように待つことができますか?これはこれまでの私の試みです。あなたが必要なもの子どもと孫を待つ
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int run = 1;
void handler(int sig, siginfo_t *info, void *uap)
{
int exit_code;
printf("sigchld pid %d\n", info->si_pid);
pid_t pid = waitpid(-1, &exit_code, 0);
if (pid == -1) {
perror("waitpid()\n");
} else {
printf("waitpid returned %d\n", pid);
}
// set run = 0 when all children exit
printf("end of sigchild handler\n");
}
void main() {
struct sigaction chld;
chld.sa_sigaction = handler;
chld.sa_flags = SA_NOCLDSTOP | SA_SIGINFO;
sigaction(SIGCHLD, &chld, NULL);
//procmask sigchld?
if (!fork()) {
if (!fork()) {
sleep(2);
printf ("grand-son exit: %d\n", getpid());
exit (0);
}
sleep(1);
printf ("son exit: %d\n", getpid());
exit (0);
}
while(run)
sleep(1);
printf("ciao\n");
}
孫を待つことはできません。子供が自分の子供を待たずに出かけると、それらの子供は通常、 "root"または "init"プロセスに再割り当てされます。 (http://en.wikipedia.org/wiki/Orphan_processを参照してください) – ruakh
1)main returns int。 2)シグナルハンドラでprintf()を使用しないでください。 3)祖父母が祖父母プロセスから切り離すための方法です(ただし、端末(グループ)から切り離すためにいくつかの追加のシステムコールが必要な場合があります) – wildplasser