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!; - 不立刻结束,5 秒之后出现
I wrote to stderr!并结束。
如果是情况 1,显然是终端在管道末尾的程序停止的时候就 kill 了前面的所有进程;如果是情况 2,则是终端在管道末尾的程序挺值得时候就继续给出 prompt,但是前面的程序并没有停止;如果是情况 3,那就是终端要等到管道里面每个程序都停止的时候才继续给出 prompt。
请问是哪一种呢?如果您有闲、使用 *nix 并想要帮助我,请帮我测试一下,谢谢 :-)