那么,假设主进程 fork 出去三个进程 ABC ,其中 AB 用 pipe1 连在一块,BC 用 pipe2 连在一块(三个连在一起,比如说echo blahblahcat | grep cat | wc)。我发现,就算 C 不用 pipe1 ,它也必须把 pipe1 的写入口关掉。
ChatGPT 进一步解释道,这是因为,Linux kernel 会监视每一个 pipe 的每一个写入口。因为 B 和 C 分属两个子进程,所以它们其实是相当于打开了两个 pipe1 的写入口。以上面那个命令行为例,B 中的grep通过 pipe1 的读入口读入数据,C 中 pipe1 的写入口一直开着,就导致 kernel 没有发送 EOF ,导致grep挂机。哪怕 B 把自己的 pipe1 写入口关掉都不行,因为 B 和 C 的 pipe1 写入口是两个拷贝。
我又查了很久的 stackoverflow ,感觉她这个解释还是很有道理的,但是毕竟我没读过源代码,所以也不敢肯定,上来请教一下大家,她说的正确吗?