34

我正在开发一个使用 C++ 并使用 Linux GNU C 编译器编译的应用程序。

Ctrl当用户使用+C 键中断脚本时,我想调用一个函数。

我应该怎么办?任何答案将不胜感激。

4

3 回答 3

70

当您按下Ctr + C时,操作系统会向进程发送一个信号。有很多信号,其中之一是 SIGINT。SIGINT(“程序中断”)是终止信号之一。

还有更多种类的终止信号,但关于 SIGINT 的有趣之处在于它可以被您的程序处理(捕获)。SIGINT 的默认操作是程序终止。也就是说,如果你的程序没有专门处理这个信号,当你按下Ctr + C你的程序时,你的程序会作为默认动作终止。

要更改信号的默认操作,您必须注册要捕获的信号。在 C 程序中注册一个信号(至少在 POSIX 系统下)有两个函数

  1. 信号(int signum,sighandler_t 处理程序);
  2. sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); .

这些函数需要将头文件signal.h包含在您的 C 代码中。我在signal下面提供了一个简单的函数示例,并附有注释。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h> //  our new library 
volatile sig_atomic_t flag = 0;
void my_function(int sig){ // can be called asynchronously
  flag = 1; // set flag
}

int main(){
  // Register signals 
  signal(SIGINT, my_function); 
  //      ^          ^
  //  Which-Signal   |-- which user defined function registered
  while(1)  
    if(flag){ // my action when signal set it 1
        printf("\n Signal caught!\n");
        printf("\n default action it not termination!\n");
        flag = 0;
    }     
  return 0;
}  

注意:您应该只在信号处理程序中调用安全/授权函数。例如,避免在信号处理程序中调用 printf

您可以使用 gcc 编译此代码并从 shell 执行它。代码中有一个无限循环,它将一直运行,直到您SIGINT按 发送信号Ctr + C

于 2013-07-20T21:42:31.903 回答
12

键入CtrlC通常会导致 shell 发送SIGINT到您的程序。为该信号添加一个处理程序(通过signal(2)或),您可以在按下sigaction(2)时做您喜欢的事情。CtrlC

或者,如果您只关心在程序退出之前进行清理,那么通过设置退出处理程序atexit(3)可能更合适。

于 2013-07-20T21:02:00.677 回答
5

您可以使用信号宏。

以下是如何处理它的示例:

#include <signal.h>
#include <stdio.h>
void sigint(int a)
{
    printf("^C caught\n");
}
int main()
{
    signal(SIGINT, sigint);
    for (;;) {}
}

样本输出:

Ethans-MacBook-Pro:~ phyrrus9$ ./a.out
^C^C caught
^C^C caught
^C^C caught
^C^C caught
^C^C caught
于 2013-07-20T21:22:35.427 回答