Linux 中的 Ctrl + C 中断事件处理
- 2024-10-24 08:51:00
- admin 原创
- 66
问题描述:
我正在开发一个使用 C++ 并使用 Linux GNU C 编译器进行编译的应用程序。
Ctrl
我想在用户使用+键中断脚本时调用一个函数C
。
我该怎么办?任何答案我都非常感谢。
解决方案 1:
当您按下 时Ctr + C
,操作系统会向进程发送一个信号。信号有很多种,其中一种是 SIGINT。SIGINT(“程序中断”)是终止信号之一。
还有几种终止信号,但 SIGINT 的有趣之处在于它可以由您的程序处理(捕获)。SIGINT 的默认操作是程序终止。也就是说,如果您的程序没有专门处理此信号,则当您按下时,Ctr + C
程序将作为默认操作终止。
要更改信号的默认操作,您必须注册要捕获的信号。要在 C 程序中注册信号(至少在 POSIX 系统下),有两个函数
信号(int 符号,ighandler_t 处理程序);
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("
Signal caught!
");
printf("
default action it not termination!
");
flag = 0;
}
return 0;
}
注意:您只应在信号处理程序中调用安全/授权的函数。例如,避免在信号处理程序中调用 printf。
您可以使用 gcc 编译此代码并从 shell 执行它。代码中有一个无限循环,它会一直运行,直到您SIGINT
按下 发送信号Ctr + C
。
解决方案 2:
键入Ctrl
`C通常会导致 shell
SIGINT向您的程序发送信息。为该信号添加一个处理程序(通过
signal(2)或),然后您就可以在按下
sigaction(2)时执行您想要的操作。
Ctrl`C
或者,如果您只关心在程序退出之前进行清理,那么通过设置退出处理程序atexit(3)
可能更合适。
解决方案 3:
您可以使用信号宏。
下面是一个处理方法的示例:
#include <signal.h>
#include <stdio.h>
void sigint(int a)
{
printf("^C caught
");
}
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
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件