我有一个创建子项的小shell(使用fork())并使用execvp执行一些命令。 它也支持&选项,所以父亲可以同时运行其他命令。 当一个孩子死了我想在控制台和孩子的pid上写,所以我为SIGCHLD定义了一个sighandler:
void backdeadchild(int sig)
{
int pid, exitstat;
pid = wait(&exitstat);
printf("Child with pid: %d died", pid);
}
问题是在处理程序打印消息后父亲也关闭了。 我已经设法理解SIGCHLD在stdin中返回一个EOF(每当父亲收到它关闭的EOF时),但为什么SIGCHLD返回EOF? 如果这是正常的......如何避免父亲关闭?
答案 0 :(得分:1)
如果孩子的stdout
(或任何其他信息流)与父母的stdin
相关联,则父母自然会收到EOF
。
如果父母没有处理它,父母可能会死于SIGPIPE
(破管)信号。