在Linux环境下,C++程序可以使用信号(signals)来处理各种异步事件。信号是一种软件中断,用于通知进程某个事件已经发生。例如,当用户按下Ctrl+C时,操作系统会向进程发送SIGINT信号,通知进程终止。
C++中的信号处理机制主要通过以下几个函数来实现:
signal():用于设置信号处理器。它的原型如下:typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
signal()函数接受两个参数,第一个参数是要处理的信号编号,第二个参数是信号处理器函数的指针。信号处理器函数的原型如下:
void signal_handler(int signum);
当进程收到指定的信号时,操作系统会调用相应的信号处理器函数。
sigaction():与signal()类似,但提供了更强大的信号处理功能。它的原型如下:#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
sigaction()函数接受三个参数,第一个参数是要处理的信号编号,第二个参数是指向新信号处理器结构的指针,第三个参数是指向旧信号处理器结构的指针。sigaction结构定义如下:
struct sigaction {
void (*sa_handler)(int);
sigset_t sa_mask;
int sa_flags;
};
sa_handler字段与signal()中的信号处理器函数指针相同。sa_mask字段用于指定在执行信号处理器函数期间要阻塞的信号集合。sa_flags字段用于设置信号处理器的行为。
raise():用于向当前进程发送信号。它的原型如下:#include <signal.h>
int raise(int signum);
raise()函数接受一个参数,即要发送的信号编号。如果成功,返回0;否则返回-1。
下面是一个简单的C++信号处理示例:
#include <iostream>
#include <csignal>
void signal_handler(int signum) {
std::cout << "Received signal: " << signum << std::endl;
}
int main() {
// 设置SIGINT信号处理器
signal(SIGINT, signal_handler);
std::cout << "Press Ctrl+C to send SIGINT signal..." << std::endl;
// 主循环,等待信号
while (true) {
sleep(1);
}
return 0;
}
在这个示例中,我们为SIGINT信号(通常由Ctrl+C触发)设置了一个简单的信号处理器,当收到信号时,它会输出一条消息。