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