在 Linux 下,C++ 可以使用信号(signals)来处理各种系统事件和异常情况。信号是一种软件中断,用于通知进程发生了某个特定事件。例如,当用户按下 Ctrl+C 时,操作系统会向进程发送 SIGINT 信号,通知进程终止。
在 C++ 中,可以使用 <csignal> 头文件中定义的信号处理函数来处理信号。下面是一个简单的示例,演示了如何在 C++ 中处理 SIGINT 信号:
#include <iostream>
#include <csignal>
// 信号处理函数
void signalHandler(int signal) {
std::cout << "接收到信号: " << signal << std::endl;
}
int main() {
// 注册信号处理函数
std::signal(SIGINT, signalHandler);
std::cout << "按 Ctrl+C 终止程序..." << std::endl;
// 主循环,等待信号
while (true) {
// 空循环,等待信号
}
return 0;
}
在这个示例中,我们首先包含了 <csignal> 头文件,并定义了一个信号处理函数 signalHandler。然后,在 main 函数中,我们使用 std::signal 函数注册了信号处理函数,将 SIGINT 信号与 signalHandler 函数关联起来。
当用户按下 Ctrl+C 时,操作系统会向进程发送 SIGINT 信号,我们的程序会调用 signalHandler 函数来处理这个信号。在这个示例中,signalHandler 函数只是简单地打印出接收到的信号编号。
需要注意的是,信号处理函数应该尽可能简单,避免执行复杂的操作,因为信号可能在任何时刻被触发,而且信号处理函数的执行可能会中断正常的程序流程。此外,某些信号(如 SIGKILL 和 SIGSTOP)无法被捕获和处理。
除了 <csignal> 头文件外,还可以使用 POSIX 信号处理 API,如 sigaction 函数,来实现更高级的信号处理功能。sigaction 函数提供了更多的控制和配置选项,例如设置信号掩码、设置信号处理动作等。