Ctrl+;Linux中的C中断事件处理 我开发了一个使用C++的应用程序,并使用Linux GNUC编译器编译。p>

Ctrl+;Linux中的C中断事件处理 我开发了一个使用C++的应用程序,并使用Linux GNUC编译器编译。p>,c++,c,linux,operating-system,signals,C++,C,Linux,Operating System,Signals,我想在用户使用Ctrl+C键中断脚本时调用函数 我该怎么办?任何答案都将不胜感激。键入CtrlC通常会导致shell向您的程序发送SIGINT。为该信号添加一个处理程序(通过或),当按下CtrlC时,您可以做自己喜欢做的事情 或者,如果您只关心在程序退出之前进行清理,则通过设置退出处理程序可能更合适。您可以使用signal宏 下面是一个如何处理的示例: #include <signal.h> #include <stdio.h> void sigint(int a) {

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

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

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


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

您可以使用signal宏

下面是一个如何处理的示例:

#include <signal.h>
#include <stdio.h>
void sigint(int a)
{
    printf("^C caught\n");
}
int main()
{
    signal(SIGINT, sigint);
    for (;;) {}
}
当您按下Ctr+C时,操作系统会向进程发送一条消息。有许多信号,其中一个是SIGINT。SIGINT(“程序中断”)是终止信号之一

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

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

  • 这些函数要求在C代码中包含标题。我在下面提供了一个带有注释的
    信号
    函数的简单示例

    #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;
    }  
    
    #包括
    #包括
    #包括//我们的新图书馆
    易失性sig_原子标志=0;
    void my_函数(int sig){//可以异步调用
    flag=1;//设置标志
    }
    int main(){
    //寄存器信号
    信号(SIGINT,my_函数);
    //      ^          ^
    //哪个信号|——注册了哪个用户定义函数
    而(1)
    if(flag){//my action when signal将其设置为1
    printf(“\n捕获信号!\n”);
    printf(“\n默认操作不是终止!\n”);
    flag=0;
    }     
    返回0;
    }  
    
    注意:您应该只调用信号处理程序。比如说


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

    您需要SIGINT,了解这与所使用的编译器有什么关系?@mozcelikors没有“GCC识别的库”这样的东西。如果有一个用标准C编写的库,任何一个健全的C编译器都应该能够编译它。格里耶什,你能给我举个例子吗?我只需要定义一个kill事件,但我不知道。避免在signal handlerSimple中使用printf的可能重复。我用它来关闭i2c连接,所以printf将被连接终止功能所取代。真的谢谢。你可以给你的疑问留下评论,我只是想给你一个快速的起点。我相信,通过更多的努力,你会更详细地探索这些事情。我非常肯定,这个过程是发出了一个信号,而不是一个信号。:-)@鸭子,嘿,鸭子,谢谢你!我的英语很差,我仔细地注意到你的编辑,并开始了解我的错误。我会改进的。谢谢@莫泽利克人记得@Grijesh Chauhan,你很聪明,但你的英语并不差。我只是填补了一些漏洞。
    atexit()
    不是替代方案,因为当程序由于信号而存在时,以这种方式注册的函数不会被调用。
    #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;
    }