当使用cat提供stdin时,C程序无法按预期工作

时间:2017-01-27 01:31:38

标签: c stdin cat

这是一个简短的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用于输入时程序按预期工作?

1 个答案:

答案 0 :(得分:4)

问题是bash没有终止,你的shell(anything)在继续之前等待管道中的所有进程终止。当您使用cat键入行时,{{1}}会尝试写入管道,获取SIGPIPE信号并终止。