如果键盘中断作为输入,执行会在哪里停止?

Where does execution stop if keyboard interrupt is given as input?

我在名为 printftest.c.

的文件中有这段简单的代码
#include <stdio.h>

int main(){
    int c, i;

    i = 0;

    while ((c = getchar())  != EOF)
        ++i;

    printf("c = %d\n", c);
    printf("i = %d\n", i);
}

编译执行如下(在Windows): gcc printftest.c && a.exe

终端会话如下所示:

gcc printftest.c && a.exe
c = -1
^C

现在,当我在终端中输入 ctrl-c(键盘中断)时,只执行第一个 printf 语句。为什么会这样?我希望打印这两个语句或 none。谁能解释执行停止的确切位置和原因?

请注意,这就是它在 Linux 上的工作方式。 Windows 有类似的东西。不完全一样,但基本原理很相似。在 Windows 中阅读更多关于如何处理它的信息:https://docs.microsoft.com/en-us/windows/console/setconsolectrlhandler

当你调用C-C时,内核会发送一个SIGINT给程序。除非这个信号被程序处理,否则它会被杀死。

这是异步完成的。它基本上是这样的:

1) User: C-C
2) Kernel: Hey program, do you hear me? I will kill you if you don't answer.
3) Kernel: The program does not seem to hear me. Let's kill it. 

2 和 3 之间发生的事情有点像赌博。 SIGINT 通常用于告诉程序用户已经厌倦了等待程序正在做的事情。内核只有在不处理SIGINT的情况下才会强行杀掉程序,但对如何处理没有要求。

如果你想明确定义行为,你必须安装一个处理程序。以下是如何修改程序(在 Linux 中)以完全忽略 C-C 的示例:

#include <signal.h>

void install_handler()
{
        static struct sigaction sigact = { 0 };
        sigact.sa_handler = SIG_IGN;
        sigaction(SIGINT, &sigact, NULL);
}

int main()
{
        install_handler()

        // Your code