Ctrl+;Linux中的C中断事件处理 我开发了一个使用C++的应用程序,并使用Linux GNUC编译器编译。p>
我想在用户使用Ctrl+C键中断脚本时调用函数 我该怎么办?任何答案都将不胜感激。键入CtrlC通常会导致shell向您的程序发送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) {
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系统下)有两个功能
信号
函数的简单示例
#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;
}