📅  最后修改于: 2023-12-03 15:14:04.059000             🧑  作者: Mango
在C++中,信号处理对于一些需要中断程序正常执行的场景非常重要,如用户按下Ctrl+C时,我们需要捕捉到这个信号并进行相应的处理。
以下是一些常用的信号列表:
| 信号值 | 默认操作 | | ------ | -------- | | SIGINT | 终止进程 | | SIGHUP | 终端关闭 | | SIGQUIT | 终止进程并生成核心转储 | | SIGILL | 非法指令 | | SIGABRT | 中止 | | SIGFPE | 浮点异常 | | SIGKILL | 终止进程(不能被捕捉或忽略) | | SIGTERM | 终止进程 |
在C++中,我们可以使用信号处理函数来捕捉信号并进行相应的处理。其基本形式如下:
void signal_handler(int signal_num) {
// 处理信号
}
其中,signal_num
即为捕捉到的信号编号。
我们需要使用signal()
函数来注册信号处理函数,其基本形式如下:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
其中,signum
为要注册的信号编号,handler
为信号处理函数的指针,返回值为前一个信号处理函数的指针。
注意:在Unix/Linux平台上,signal()
函数是过时的,推荐使用sigaction()
函数。
以下是一个简单的示例代码,演示了如何捕捉SIGINT
信号并进行相应的处理:
#include <iostream>
#include <csignal>
using namespace std;
void signal_handler(int signal_num) {
cout << "Caught signal " << signal_num << endl;
// 恢复默认操作
signal(signal_num, SIG_DFL);
}
int main () {
// 注册信号处理函数
signal(SIGINT, signal_handler);
// 无限循环
while(1) {
cout << "Hello, World!" << endl;
sleep(1);
}
return 0;
}
在上面的代码中,我们使用了signal()
函数来注册了一个信号处理函数,并在函数中输出了捕捉到的信号编号。我们使用了SIG_DFL
来恢复默认操作,以避免出现无限循环的情况。
通过本文的介绍,我们了解了C++中信号处理的一些基本知识和常用操作。在实际开发中,我们需要根据具体情况来选择合适的信号进行处理,以保证程序的稳定性和可靠性。