Codepad 链接: http://codepad.org/LFkfcDXW
起因是我发现 Windows Command Prompt 的管道的一个有趣行为:
考虑命令
a | b
,如果b
结束之后a
不退出(比如a
是yes
,无脑循环输出y
加换行),则cmd
会 hang,可以用Ctrl+C
打断
这个问题自然是可以解决的,只要实现 yes
的时候判断一下输出有没有成功即可。
自然我想知道 *nix 系里的管道是怎么一个情况。我的一个朋友告诉我执行 yes | 另一个程序
的时候,另一个程序结束的时候 yes
也会结束,不会 hang 住终端,也不会需要自己去 kill 那个 yes
。我对这个机制感到很好奇……想问一下,如果有下面两段代码:
/* program1.c */
#include<cstdio>
#include<unistd.h>
int main(void)
{
sleep(5);
fputs("I wrote to stderr!\n", stderr);
return 0;
}
和
/* program2.c */
int main(void){return 0;}
如果我编译、执行 program1 | program2
,那么有如下可能:
I wrote to stderr!
;I wrote to stderr!
;I wrote to stderr!
并结束。如果是情况 1,显然是终端在管道末尾的程序停止的时候就 kill 了前面的所有进程;如果是情况 2,则是终端在管道末尾的程序挺值得时候就继续给出 prompt,但是前面的程序并没有停止;如果是情况 3,那就是终端要等到管道里面每个程序都停止的时候才继续给出 prompt。
请问是哪一种呢?如果您有闲、使用 *nix 并想要帮助我,请帮我测试一下,谢谢 :-)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.