C-在按ENTER键之前捕获SIGINT之后,程序不会结束

问题描述 投票:0回答:1

为什么在按下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键后,它才允许我在终端中键入任何命令。这是为什么?

c volatile sigint signal-handling
1个回答
1
投票

这是因为fgetc()正在阻止执行。因此,只有在按下Enter键(释放fgetc())之后,keepRunning才会被评估。

终端也被缓冲,因此只有按回车键时,字符才会一一发送到fgetc()。这就是为什么它仅在按Enter键之后才存在,而在其他键之后不存在的原因。

© www.soinside.com 2019 - 2024. All rights reserved.