在C++ Linux编程中,处理信号(signals)是一种常见的需求,因为它们允许程序响应各种系统事件,如中断、终止请求等。以下是处理信号的基本步骤和示例代码:
首先,你需要包含处理信号所需的头文件:
#include <csignal>
#include <iostream>
定义一个函数来处理特定的信号。这个函数的原型通常是:
void signalHandler(int signum);
其中 signum
是接收到的信号编号。
使用 signal
或 sigaction
函数来注册信号处理函数。sigaction
提供了更细粒度的控制,推荐使用。
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 interrupt.\n";
while (true) {
// 主循环
}
return 0;
}
sigaction
函数#include <csignal>
#include <iostream>
void signalHandler(int signum) {
std::cout << "Interrupt signal (" << signum << ") received.\n";
// 清理并关闭
// 终止程序
exit(signum);
}
int main() {
struct sigaction sa;
sa.sa_handler = signalHandler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
// 注册信号 SIGINT 的处理函数
if (sigaction(SIGINT, &sa, NULL) == -1) {
perror("sigaction");
exit(EXIT_FAILURE);
}
std::cout << "Program is running. Press Ctrl+C to interrupt.\n";
while (true) {
// 主循环
}
return 0;
}
你可以为不同的信号注册不同的处理函数。例如:
#include <csignal>
#include <iostream>
void signalHandlerSIGINT(int signum) {
std::cout << "SIGINT signal (" << signum << ") received.\n";
}
void signalHandlerSIGTERM(int signum) {
std::cout << "SIGTERM signal (" << signum << ") received.\n";
}
int main() {
struct sigaction saSIGINT, saSIGTERM;
saSIGINT.sa_handler = signalHandlerSIGINT;
sigemptyset(&saSIGINT.sa_mask);
saSIGINT.sa_flags = 0;
saSIGTERM.sa_handler = signalHandlerSIGTERM;
sigemptyset(&saSIGTERM.sa_mask);
saSIGTERM.sa_flags = 0;
if (sigaction(SIGINT, &saSIGINT, NULL) == -1) {
perror("sigaction SIGINT");
exit(EXIT_FAILURE);
}
if (sigaction(SIGTERM, &saSIGTERM, NULL) == -1) {
perror("sigaction SIGTERM");
exit(EXIT_FAILURE);
}
std::cout << "Program is running. Press Ctrl+C or send SIGTERM to terminate.\n";
while (true) {
// 主循环
}
return 0;
}
printf
、malloc
等)。sigprocmask
函数来屏蔽某些信号,以防止它们在关键代码段中被处理。通过以上步骤,你可以在C++ Linux编程中有效地处理信号。