当使用 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 信号,然后终止。
这是一个简短的 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 信号,然后终止。