Linux中的Ctrl + C中断事件处理

时间:2013-07-20 20:47:26

标签: c++ c linux signals

我正在开发一个使用C ++并使用Linux GNU C Compiler编译的应用程序。但是,我想调用一个函数,因为用户使用 Ctrl C 键来中断脚本。我该怎么办?任何答案都将非常感激。

3 个答案:

答案 0 :(得分:52)

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

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

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

  1. signal(int signum, sighandler_t handler);
  2. sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
  3. 这些函数要求标题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;
    }  
    

    注意:您只应在信号处理程序中调用safe/authorized functions。例如avoid calling printf in signal handler

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

答案 1 :(得分:11)

键入 Ctrl C 通常会导致shell将SIGINT发送到您的程序。为该信号添加处理程序(通过signal(2)sigaction(2)),当按下 Ctrl C 时,您可以执行您喜欢的操作。

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

答案 2 :(得分:4)

您可以使用信号宏。

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

#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