基本上我有一个父进程,它会分叉一个孩子并通过管道将它作为stdin . 子进程可以在以下两种情况之一中终止:
-
管道的写入端由父级关闭,这意味着它到达了stdin的末尾,因此接收到 EOF ,
-
或它通过管道接收某个输入(在这种情况下为 -1 )并退出
我的父代码看起来大致如下:
close(pi[0]); // close input end
signal(SIGPIPE, SIG_IGN); // do not handle SIGPIPE
char buffer;
int ok = 1;
while(ok && read(STDIN_FILENO, &buffer, 1) > 0) {
int b_written = write(pi[1], &buffer, 1);
if(b_written == -1) {
if(errno == EPIPE) ok = 0;
else perror("pipe write"); // some other error
}
}
如您所见,我通过检查 errno == EPIPE
来检查管道的读取端是否已关闭 . 但是,这意味着read循环在关闭之前会进行一次额外的迭代 . 我怎么可能轮询看管道是否关闭而不必写一些东西?
1 回答
孩子可以在检测到信号时发送信号,例如
SIGUSR1
. 父可以在收到SIGUSR1
信号时设置一个标志,并在尝试读取输入之前检查此标志 . 但是我不能确定在从stdin
读取输入之前检查标志ans之后无法接收SIGUSR1
. 所以我更喜欢使用控制管道,每次孩子知道它将能够读取在该控制管道中写入1的另外一个数据 . 结果可能是这样的: