一尘不染

Linux中Ctrl + C中断事件处理

linux

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

我想在用户使用Ctrl+ C 键中断脚本时调用函数。

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


阅读 970

收藏
2020-06-02

共1个答案

一尘不染

按时Ctr + C,操作系统将向该进程发送信号。有许多信号,其中之一是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);

这些功能要求标头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;
}

注意:您只能在信号处理程序中调用安全/授权函数

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

2020-06-02