我在名为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语句。为什么会这样?我希望只打印两个语句,也可以不打印。谁能解释执行的确切停止位置以及原因?
最佳答案
注意,这就是它在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