我使用pipe()、fork()、dup()和execve()来生成一个子进程。
从父进程的角度,等待子进程的stdin和stdout关闭(即在两者上执行read()返回0),然后再执行waitpid()以收集终止状态是否安全?
还是说可能会出现进程失败但从未关闭stdin和stdout的情况?(因此我的程序永远无法达到waitpid)。
为了澄清,我想知道以下操作是否安全:
从父进程的角度,等待子进程的stdin和stdout关闭(即在两者上执行read()返回0),然后再执行waitpid()以收集终止状态是否安全?
还是说可能会出现进程失败但从未关闭stdin和stdout的情况?(因此我的程序永远无法达到waitpid)。
为了澄清,我想知道以下操作是否安全:
while (child_stdin != -1 && child_stdout != -1) {
poll(...)
if (got_stdout) {
n = read(child_stdout);
if (n >= 0) {
// do something with output
} else if (n == 0) {
child_stdout = -1
}
}
// same for stdin
}
waitpid(child_pid)
或者说孩子进程可能会终止,但我读取()或写入()时不会得到0。
没有信号参与,只是使用了poll()。
read
和fread
将返回0。fgetc
、getc
等返回一个整数值,C预处理器通过标签“EOF”进行识别,人们用“管道在所有写入端都关闭且数据耗尽时尝试读取时会出现EOF”的表达式缩短“管道到达EOF”。您永远不会“接收EOF”。 - William Pursell