parent 是否在 child 退出时看到管道 eof?

Does parent see pipe eof on child exit?

假设您创建一个 pipe 然后 fork。在parent中,你close写端和fdopen读端得到一个FILE*。在child,你closestdoutdup2管道的写端到stdoutclose管道的两端,和exec。在什么条件下,例如 execd child 做什么或在 parent 中进行的其他调用,parent 会在 [=16= 上看到 eof ] 当 child 在消耗 stdout 后退出时,或者像 getline 这样的调用会挂起吗?

我相信如果您正确设置了管道(听起来您确实做到了),parent 确实应该看到 EOF。相关的问题是 parent 还必须为 child 照顾 wait,否则 child 将成为僵尸。

标准 I/O 库在底层使用 read(2)write(2)read(2) 的行为是 return 0 以在管道中没有更多可用数据且没有活动的编写器时指示 EOF(标准 I/O 库然后将其转换为负 EOF 常量我们都知道)。

所以,如果你设置得当,getline() 不会挂起,它会 return -1。

如果您看到 getline() 在子进程终止并关闭管道时仍然挂起,您可能在其他地方打开了管道写入通道。仔细检查以确保在调用 getline().

之前父级已关闭写入通道

当进程因任何原因终止时,操作系统将关闭所有剩余的打开文件描述符。

对于管道、文件和套接字,挂起数据首先是 written/sent,然后是 OS。另一个对等点收到待处理数据后跟 EOF,不需要 "proper set up"。