父母是否在孩子出口看到管道eof?

时间:2015-07-07 22:29:33

标签: c pipe eof file-pointer

假设您创建了pipe,然后创建了fork。在父级中,您close写作结束,fdopen阅读结束以获得FILE*。在孩子中,您close stdoutdup2管道的写入端到stdoutclose管道两端,exec }。在什么条件下,例如exec d孩子做了什么或父母做了什么电话,当孩子在消费eof后退出时,父母会在FILE*上看到stdout或者getline之类的电话会挂起来吗?

3 个答案:

答案 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,没有"正确设置"是必要的。