当使用 cat 提供标准输入时,C 程序无法按预期工作

C program does not work as expected when stdin is supplied using 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 作为输入,这个问题是否可以修复,以便程序按预期工作?

问题是 cat 没有终止,您的 shell (bash) 在继续之前等待管道中的所有进程终止。当您键入带有 anything 的行时,cat 尝试写入管道,获取 SIGPIPE 信号,然后终止。