我有一个小shell,它用fork()创建孩子,并让他们用execvp执行一些命令。
它还支持&option,这样父亲可以同时运行其他命令。
当一个孩子死了,我想把它写在控制台和孩子的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?
如果是正常的。。如何避免父亲关门?
最佳答案
如果子流的stdout
(或任何其他流)连接到父流的stdin
,则父流自然会收到EOF
。
或者,如果父节点不处理,则父节点可能会死于SIGPIPE
(断管)信号。
关于c - 处理SIGCHLD会将EOF返回给父亲,为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2325711/