parent 是否在 child 退出时看到管道 eof?
Does parent see pipe eof on child exit?
假设您创建一个 pipe
然后 fork
。在parent中,你close
写端和fdopen
读端得到一个FILE*
。在child,你close
,stdout
,dup2
管道的写端到stdout
,close
管道的两端,和exec
。在什么条件下,例如 exec
d 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"。
假设您创建一个 pipe
然后 fork
。在parent中,你close
写端和fdopen
读端得到一个FILE*
。在child,你close
,stdout
,dup2
管道的写端到stdout
,close
管道的两端,和exec
。在什么条件下,例如 exec
d 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"。