gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:11:09 24 4
gpt4 key购买 nike

我在一个名为 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
终端 session 如下所示:
gcc printftest.c && a.exe
c = -1
^C

现在,当我在终端中将 ctrl-c(键盘中断)作为输入时,只执行第一个 printf 语句。为什么会发生这种情况?我希望打印两个语句或不打印。谁能解释一下执行到底在哪里停止以及为什么?

最佳答案

请注意,这就是它在 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

关于c - 如果键盘中断作为输入,执行在哪里停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58708431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com