1

假设您创建了一个pipe然后fork. 在父级中,您close在写作端和fdopen阅读端获得一个FILE*. 在孩子中,您close stdoutdup2管道的一端写入管道的stdout两端close,以及exec。在什么条件下,例如execd 孩子做了什么或在父母中进行了其他调用,父母会eofFILE*孩子在消费后退出时看到stdout还是会像getline挂起这样的调用?

4

3 回答 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 回答