假设您创建了一个pipe
然后fork
. 在父级中,您close
在写作端和fdopen
阅读端获得一个FILE*
. 在孩子中,您close
stdout
将dup2
管道的一端写入管道的stdout
两端close
,以及exec
。在什么条件下,例如exec
d 孩子做了什么或在父母中进行了其他调用,父母会eof
在FILE*
孩子在消费后退出时看到stdout
还是会像getline
挂起这样的调用?
问问题
216 次
3 回答
1
我相信,如果您正确设置了管道(听起来您已经正确设置了管道),则父级确实应该看到 EOF。相关的问题是父母也必须照顾wait
孩子,否则孩子将成为僵尸。
于 2015-07-07T23:04:41.513 回答
1
标准 I/O 库在后台使用read(2)
和write(2)
;的行为read(2)
是在管道中没有更多可用数据且没有活动写入器时返回 0 以指示 EOF(标准 I/O 库然后将其转换为我们都知道的负 EOF 常量)。
所以,如果你设置得当,getline()
它不会挂起,它会返回-1。
如果getline()
即使孩子已经终止并关闭了管道,您仍然看到挂起,您可能在其他地方打开了管道写入通道。仔细检查以确保父级在调用之前已关闭写入通道getline()
。
于 2015-07-07T23:08:24.140 回答
0
当进程因任何原因终止时,操作系统会关闭所有剩余的打开文件描述符。
对于管道、文件和套接字,挂起的数据首先由操作系统写入/发送。另一个对等方收到待处理的数据,后面跟着EOF
,不需要“正确设置”。
于 2015-07-07T23:45:12.460 回答