Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理SIGCHLD会把EOF还给父亲,为什么?_C_Fork_Wait_Eof - Fatal编程技术网

处理SIGCHLD会把EOF还给父亲,为什么?

处理SIGCHLD会把EOF还给父亲,为什么?,c,fork,wait,eof,C,Fork,Wait,Eof,我有一个小shell,它创建子对象(使用fork()),并使它们使用execvp执行一些命令。 它还支持&选项,因此父亲可以同时运行其他命令。 当一个孩子死了,我想把它写在控制台和孩子的pid上,所以我为SIGCHLD定义了一个sighandler: void backdeadchild(int sig) { int pid, exitstat; pid = wait(&exitstat); printf("Child with pid: %d died", pid); } 问题

我有一个小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呢?
如果这是正常的。。如何避免父亲关闭?

如果孩子的
stdout
(或任何其他流)连接到父母的
stdin
,父母收到
EOF
是很自然的


或者,如果家长不处理,家长可能会死于
SIGPIPE
(断管)信号。

如果孩子的
stdout
(或任何其他流)连接到家长的
stdin
,家长自然会收到
EOF


或者,如果家长不处理信号,家长可能会因信号管破裂而死亡。

谢谢您的解释,但如何忽略该EOF?我试图在SIGCHLD信号处理程序中放入一个getchar(),它似乎可以工作,但只要我按enter键,父进程就会关闭。尝试捕获
SIGPIPE
信号-可能这就是原因吧?它不会给出SIGPIPE。。我试着调试代码,结果发生了奇怪的事情。。我在等待之后放了一个getchar()。。所以它读取EOF,然后我开始调试,我给出“sleep 2&”作为命令,子进程死亡,我收到消息,然后当我按enter键时,它接收EOF并关闭。奇怪的是,有时如果我在按enter键时设置断点并进行调试,它会收到一个EOL并再次打印提示,但如果我再次按enter键,它会收到一个EOF,或者有时我可以发出另一个后台命令,但在子模块死亡后按enter键会关闭父模块。几乎不可能可靠地调试信号。我建议在parent上使用
strace
实用程序-它将显示所有捕获的系统调用和信号。哇,谢谢,我想我找到了问题,但现在我需要一些关于如何解决问题的建议。问题是,在我尝试使用getchar()删除EOF后,我的SIGCHLD处理程序在输入中返回:rt_sigreturn(0)=-1 EINTR(中断的系统调用)(这就是EOF保留在输入中的原因)。因此,一种解决方案可以是计算返回的子级数(增加sig处理程序中的全局计数器..但这样做安全吗?),并跳过与计数器相等的EOF数。。如果一个孩子没有给出EOF,我只需重置这个数字。谢谢你的解释,但是如何忽略EOF呢?我试图在SIGCHLD信号处理程序中放入一个getchar(),它似乎可以工作,但只要我按enter键,父进程就会关闭。尝试捕获
SIGPIPE
信号-可能这就是原因吧?它不会给出SIGPIPE。。我试着调试代码,结果发生了奇怪的事情。。我在等待之后放了一个getchar()。。所以它读取EOF,然后我开始调试,我给出“sleep 2&”作为命令,子进程死亡,我收到消息,然后当我按enter键时,它接收EOF并关闭。奇怪的是,有时如果我在按enter键时设置断点并进行调试,它会收到一个EOL并再次打印提示,但如果我再次按enter键,它会收到一个EOF,或者有时我可以发出另一个后台命令,但在子模块死亡后按enter键会关闭父模块。几乎不可能可靠地调试信号。我建议在parent上使用
strace
实用程序-它将显示所有捕获的系统调用和信号。哇,谢谢,我想我找到了问题,但现在我需要一些关于如何解决问题的建议。问题是,在我尝试使用getchar()删除EOF后,我的SIGCHLD处理程序在输入中返回:rt_sigreturn(0)=-1 EINTR(中断的系统调用)(这就是EOF保留在输入中的原因)。因此,一种解决方案可以是计算返回的子级数(增加sig处理程序中的全局计数器..但这样做安全吗?),并跳过与计数器相等的EOF数。。如果一个孩子没有给出EOF,我只需重置这个数字。