C++ 信号处理学习笔记
1. 信号处理的基本概念
- 作用:信号是操作系统向进程发送的一种异步通知,用于处理外部事件(如键盘输入、硬件异常等)。
- 优势:信号处理可以在程序运行时响应外部事件,进行相应的处理,增强程序的健壮性和稳定性。
- 发展历程:信号处理是Unix/Linux操作系统中的一个重要特性,被C++等编程语言广泛支持和应用。
示例代码:
#include <iostream>
#include <csignal>
// 信号处理函数
void signalHandler(int signum) {
std::cout << "Received signal: " << signum << std::endl;
// 在这里可以处理信号,如执行相应的处理逻辑或者设置标志位
}
int main() {
// 注册信号处理函数
signal(SIGINT, signalHandler); // SIGINT表示终端中断信号(Ctrl+C)
std::cout << "Waiting for signal..." << std::endl;
while (true) {
// 进入无限循环,等待信号到来
}
return 0;
}
2. 信号处理的应用场景
- 处理终端中断:处理用户在终端输入Ctrl+C产生的终端中断信号,执行相应的清理工作或者退出程序。
- 处理错误情况:在程序发生严重错误时,可以通过信号处理来记录错误信息、保存数据等操作。
- 多进程通信:父子进程之间可以通过信号进行通信,实现简单的进程间同步和通信。
示例代码:
#include <iostream>
#include <csignal>
#include <unistd.h>
// 全局变量,用于标记是否收到信号
volatile sig_atomic_t signalReceived = 0;
// 信号处理函数
void signalHandler(int signum) {
signalReceived = signum;
}
int main() {
// 注册信号处理函数
signal(SIGUSR1, signalHandler); // SIGUSR1表示用户自定义信号1
// 创建子进程
pid_t pid = fork();
if (pid == 0) {
// 子进程发送信号给父进程
sleep(1); // 等待1秒钟,确保父进程已经准备好接收信号
kill(getppid(), SIGUSR1); // 向父进程发送SIGUSR1信号
return 0;
} else if (pid > 0) {
// 父进程等待信号
std::cout << "Waiting for signal..." << std::endl;
while (!signalReceived) {
// 进入循环等待信号到来
}
std::cout << "Received signal: " << signalReceived << std::endl;
} else {
std::cerr << "Fork failed!" << std::endl;
return 1;
}
return 0;
}
3. 信号处理的使用技巧
- 信号处理函数的编写:信号处理函数应该尽量简洁,避免在信号处理函数中执行耗时操作。
- 安全退出:在信号处理函数中应该保证程序能够安全退出,释放资源,防止资源泄漏。
- 信号屏蔽:可以通过信号屏蔽机制来暂时屏蔽某些信号,以避免在关键代码段中被信号中断。
示例代码:
#include <iostream>
#include <csignal>
#include <unistd.h>
// 信号处理函数
void signalHandler(int signum) {
std::cout << "Received signal: " << signum << std::endl;
// 安全退出
exit(signum);
}
int main() {
// 注册信号处理函数
signal(SIGINT, signalHandler); // SIGINT表示终端中断信号(Ctrl+C)
std::cout << "Waiting for signal..." << std::endl;
while (true) {
// 进入无限循环,等待信号到来
}
return 0;
}
4. 实战案例分析
- 网络编程:在网络编程中,可以通过信号处理函数来处理网络连接中断、超时等情况,进行相应的重连或者资源释放操作。
- 多线程编程:在多线程编程中,可以通过信号处理函数来处理线程的异常退出、死锁等情况,进行相应的资源回收或者重启操作。
通过学习信号处理,可以更好地掌握在C++程序中如何处理外部事件,提高程序的健壮性和稳定性。