在Linux系统中,C++信号处理机制是一种允许程序响应异步事件的方法。这些事件通常是由操作系统或其他进程产生的,例如用户按下Ctrl+C、进程收到终止信号等。C++通过signal库提供了对这些信号的处理功能。
SIGINT:由用户按下Ctrl+C产生。SIGTERM:请求进程终止。SIGKILL:强制终止进程,无法被捕获或忽略。SIGSEGV:段错误,通常由于访问非法内存地址引起。SIGABRT:程序调用abort()函数时产生。在C++中,可以使用signal函数来设置信号处理函数。以下是一个简单的示例:
#include <csignal>
#include <iostream>
// 信号处理函数
void signalHandler(int signum) {
std::cout << "Interrupt signal (" << signum << ") received.\n";
// 清理并关闭资源
// 终止程序
exit(signum);
}
int main() {
// 注册信号 SIGINT 和信号处理函数
signal(SIGINT, signalHandler);
std::cout << "Program is running. Press Ctrl+C to terminate.\n";
while (true) {
// 主循环
}
return 0;
}
在这个示例中,当用户按下Ctrl+C时,程序会捕获SIGINT信号,并调用signalHandler函数来处理该信号。
信号掩码用于控制哪些信号可以被处理。可以使用sigprocmask函数来设置信号掩码。以下是一个示例:
#include <csignal>
#include <iostream>
#include <unistd.h>
// 信号处理函数
void signalHandler(int signum) {
std::cout << "Interrupt signal (" << signum << ") received.\n";
exit(signum);
}
int main() {
sigset_t mask;
int signum;
// 清空信号掩码
sigemptyset(&mask);
// 添加 SIGINT 到信号掩码
sigaddset(&mask, SIGINT);
// 阻塞 SIGINT 信号
sigprocmask(SIG_BLOCK, &mask, NULL);
// 注册信号 SIGINT 和信号处理函数
signal(SIGINT, signalHandler);
std::cout << "Program is running. Press Ctrl+C to terminate.\n";
while (true) {
// 主循环
}
return 0;
}
在这个示例中,SIGINT信号被阻塞,直到信号掩码被修改以允许该信号通过。
通过理解和使用C++的信号处理机制,可以编写出更加健壮和响应迅速的程序。