信号
C++标准库提供了不同的信号类型,共六种:SIGTERM, SIGSEGV, SIGINT, SIGILL, SIGABRT, SIGFPE。 在使用标准库std::signal、std::raise处理函数时,信号必须是这六种之一
针对这些信号,有两种不同的处理方式:SIG_DFL, SIG_IGN
宏SIG_ERR
提示信号出错
API
std::sig_atomic_t
#include <csignal> typedef /* unspecified */ sig_atomic_t;
作用:
- 能从非同步信号处理函数作为原子实体访问的整数类型
- 在引入 std::atomic 和 std::atomic_signal_fence 的 C++11 前,严格遵从程序在信号处理函数所能做的唯有赋值给 volatile static std::sig_atomic_t 变量并立即返回。
std::signal
作用:为特定信号设置信号处理函数
#include <csignal>
#include <iostream>
namespace
{
volatile std::sig_atomic_t gSignalStatus;
}
void signal_handler(int signal){
gSignalStatus = signal;
}
int main()
{
// 安装信号处理函数
std::signal(SIGINT, signal_handler);
std::cout << "SignalValue: " << gSignalStatus << '\n';
std::cout << "Sending signal " << SIGINT << '\n';
std::raise(SIGINT);
std::cout << "SignalValue: " << gSignalStatus << '\n';
}
std::raise
作用:为特定信号运行信号处理函数
#include <csignal>
#include <iostream>
void signal_handler(int signal)
{
std::cout << "Received signal " << signal << '\n';
}
int main()
{
// 安装信号处理函数
std::signal(SIGTERM, signal_handler);
std::cout << "Sending signal " << SIGTERM << '\n';
std::raise(SIGTERM);
}