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

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

我在名为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语句。为什么会这样?我希望只打印两个语句或不打印。任何人都可以解释执行的确切停止位置以及原因吗?

c printf eof windows-console keyboardinterrupt
1个回答
3
投票

注意,这就是它在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
© www.soinside.com 2019 - 2024. All rights reserved.