如果键盘中断作为输入,执行会在哪里停止?
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
我在名为 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