📜  C++信号处理(1)

📅  最后修改于: 2023-12-03 15:14:04.059000             🧑  作者: Mango

C++信号处理

在C++中,信号处理对于一些需要中断程序正常执行的场景非常重要,如用户按下Ctrl+C时,我们需要捕捉到这个信号并进行相应的处理。

1. 常用信号

以下是一些常用的信号列表:

| 信号值 | 默认操作 | | ------ | -------- | | SIGINT | 终止进程 | | SIGHUP | 终端关闭 | | SIGQUIT | 终止进程并生成核心转储 | | SIGILL | 非法指令 | | SIGABRT | 中止 | | SIGFPE | 浮点异常 | | SIGKILL | 终止进程(不能被捕捉或忽略) | | SIGTERM | 终止进程 |

2. 信号处理函数

在C++中,我们可以使用信号处理函数来捕捉信号并进行相应的处理。其基本形式如下:

void signal_handler(int signal_num) {
  // 处理信号
}

其中,signal_num即为捕捉到的信号编号。

3. 信号注册

我们需要使用signal()函数来注册信号处理函数,其基本形式如下:

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

其中,signum为要注册的信号编号,handler为信号处理函数的指针,返回值为前一个信号处理函数的指针。

注意:在Unix/Linux平台上,signal()函数是过时的,推荐使用sigaction()函数。

4. 示例代码

以下是一个简单的示例代码,演示了如何捕捉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来恢复默认操作,以避免出现无限循环的情况。

5. 小结

通过本文的介绍,我们了解了C++中信号处理的一些基本知识和常用操作。在实际开发中,我们需要根据具体情况来选择合适的信号进行处理,以保证程序的稳定性和可靠性。