这是一个简短的C程序:
#include<stdio.h>
int main (void){
char cmd;
while(scanf("%c", &cmd) != EOF){
if(cmd == 'q'){
printf("Thanks\n");
return 0;
}
}
return 0;
}
当执行以下程序并使用键盘输入cmd
的值时,一切都按预期工作。
$ ./catproblem
q
Thanks
$
但是,当我尝试使用cat
管道输入时,程序在输入q
时不会立即终止。由于某种原因,它等待任何其他输入,然后才终止。
$ cat | ./catproblem
q
Thanks
anything
$
导致这种行为的原因是什么?这是否可以修复,以便在cat
用于输入时程序按预期工作?
答案 0 :(得分:4)
问题是bash
没有终止,你的shell(anything
)在继续之前等待管道中的所有进程终止。当您使用cat
键入行时,{{1}}会尝试写入管道,获取SIGPIPE信号并终止。