Обработка SIGCHLD вернет EOF отцу, почему? - PullRequest
1 голос
/ 24 февраля 2010

У меня есть небольшая оболочка, которая создает дочерние элементы (с помощью fork ()) и заставляет их выполнять некоторые команды с помощью execvp. Он также поддерживает опцию &, чтобы отец мог одновременно выполнять другие команды. Когда ребенок умирает, я хочу написать это на консоли, а также дочерний pid, поэтому я определил sighandler для SIGCHLD:

void backdeadchild(int sig)
{
 int pid, exitstat;
 pid = wait(&exitstat);
 printf("Child with pid: %d died", pid);
}

Проблема в том, что после того, как обработчик напечатает сообщение, отец закрывается. Мне удалось понять, что SIGCHLD возвращает EOF в stdin (и всякий раз, когда отец получает EOF, он закрывается), но почему SIGCHLD возвращает EOF? Если это нормально .. как избежать, чтобы отец закрылся?

1 Ответ

1 голос
/ 24 февраля 2010

Если дочерний stdout (или любой другой поток) подключен к родительскому stdin, естественно, что родитель получает EOF.

В качестве альтернативы родитель может умереть от сигнала SIGPIPE (сломанная труба), если родитель не справится с этим.

...