根据她的解释,在 Linux C 编程中,如果主进程 fork 出去两个子进程 B,C 的话,B 和 C 都会拷贝一份所有打开的 file descriptor 。
那么,假设主进程 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 ,感觉她这个解释还是很有道理的,但是毕竟我没读过源代码,所以也不敢肯定,上来请教一下大家,她说的正确吗?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.