在Linux中,信号(signals)是一种用于进程间通信和异常处理的机制。信号可以由操作系统发送给进程,以通知进程发生了某个事件,例如中断、终止、错误等。C++程序可以通过信号处理函数来响应这些信号。
Linux中的信号处理机制主要包括以下几个方面:
Linux定义了多种信号类型,常见的包括:
SIGINT:中断信号,通常由Ctrl+C产生。SIGTERM:终止信号,用于请求进程正常终止。SIGKILL:强制终止信号,无法被捕获或忽略。SIGSEGV:段错误信号,当程序访问非法内存时产生。SIGABRT:异常终止信号,通常由abort()函数产生。SIGFPE:浮点异常信号,例如除以零。SIGILL:非法指令信号,当程序执行非法指令时产生。在C++中,可以使用signal函数来设置信号处理函数。信号处理函数的原型通常如下:
void signal_handler(int signum);
其中,signum是接收到的信号编号。
示例代码:
#include <csignal>
#include <iostream>
void signal_handler(int signum) {
std::cout << "Received signal " << signum << std::endl;
// 执行清理工作或其他处理
exit(signum);
}
int main() {
// 设置SIGINT信号的处理函数
signal(SIGINT, signal_handler);
std::cout << "Press Ctrl+C to send SIGINT signal..." << std::endl;
// 主循环,等待信号
while (true) {
// 模拟程序运行
}
return 0;
}
除了自定义信号处理函数外,还可以选择忽略某个信号或使用默认处理方式:
signal(signum, SIG_IGN):忽略信号。signal(signum, SIG_DFL):使用默认处理方式。在某些情况下,可能需要临时屏蔽某些信号,以防止它们在关键代码段中被处理。可以使用sigprocmask函数来设置信号屏蔽字。
示例代码:
#include <csignal>
#include <iostream>
#include <unistd.h>
void signal_handler(int signum) {
std::cout << "Received signal " << signum << std::endl;
}
int main() {
// 设置SIGINT信号的处理函数
signal(SIGINT, signal_handler);
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask, SIGINT);
// 屏蔽SIGINT信号
sigprocmask(SIG_BLOCK, &mask, NULL);
std::cout << "SIGINT is blocked. Press Ctrl+C..." << std::endl;
// 主循环,等待信号
while (true) {
sleep(1);
}
return 0;
}
通过合理使用信号处理机制,可以提高程序的健壮性和响应能力。