为什么在按下ENTER
之后在终端中按下Ctrl + C
之前,程序没有结束?这是我的代码:
static volatile sig_atomic_t keepRunning = 1;
void intHandler(int sig)
{
keepRunning = 0;
}
int main(int argc, char *argv[])
{
signal(SIGINT, intHandler);
int ch;
while((ch = fgetc(stdin)) && keepRunning)
{
...
}
exit(EXIT_SUCCESS);
}
我已经设置了while循环以从stdin读取字符并运行直到捕获到SIGINT
。之后,keepRunning
将设置为0
,循环应结束并终止程序。但是,当我按下Ctrl + C
时,我的程序不再接受任何输入,但是直到按ENTER
键后,它才允许我在终端中键入任何命令。这是为什么?
这是因为fgetc()
正在阻止执行。因此,只有在按下Enter键(释放fgetc()
)之后,keepRunning才会被评估。
终端也被缓冲,因此只有按回车键时,字符才会一一发送到fgetc()
。这就是为什么它仅在按Enter键之后才存在,而在其他键之后不存在的原因。