👻 概念
- 信号 —— 操作系统传给进程的中断,会提早终止程序
- 有些信号不能被程序捕获,有些则可以被捕获,并基于信号采取适当的动作
信号 | 描述 |
---|---|
SIGABRT | 程序的异常终止,如调用 abort |
SIGFPE | 错误的算术运算,比如除以零或导致溢出的操作 |
SIGILL | 检测非法指令 |
SIGINT | 程序终止 (interrupt) 信号 |
SIGSEGV | 非法访问内存 |
SIGTERM | 发送到程序的终止请求 |
👻 准备工作
使用信号处理需要包含 <csignal>
头文件:
#include <csignal>
👻 捕获信号
👾语法格式
使用 signal()
函数 捕获信号
void signal(registered signal, signal handler)
-
参数
signal
—— 要设置信号的标识符
👾示例代码
- 使用
signal()
函数捕获SIGINT
信号,并将其与信号处理程序signalHandler()
相关联。
void signalHandler(int signum) {
cout << "Interrupt signal (" << signum << ") received.\n";
exit(signum); // 终止程序
}
...
// 注册信号 SIGINT 和信号处理程序
signal(SIGINT, signalHandler);
while(1) {
cout << "Going to sleep...." << endl;
sleep(1);
}
Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received. // 按下 ctrl+c 键时退出程序
👻 生成信号
👾语法格式
使用 raise()
函数 生成信号
int raise (signal sig);
- 参数
sig
—— 要发送的整数信号编号,包括SIGINT
、SIGABRT
、SIGFPE
、SIGILL
、SIGSEGV
、SIGTERM
、SIGHUP
👾示例代码
- 使用
raise()
函数生成SIGINT
信号,并通过signal()
函数捕获并处理。
void signalHandler( int signum ) {
cout << "Interrupt signal (" << signum << ") received.\n";
exit(signum);
}
...
signal(SIGINT, signalHandler);
int i = 0;
while(++i) {
cout << "Going to sleep...." << endl;
if(i==3)
raise( SIGINT); // 生成 SIGINT 信号
sleep(1);
}
Sleep函数
功能:执行挂起,等待一段时间后再继续执行
用法:
void Sleep(DWORD dwMilliseconds); // Windows系统,dwMilliseconds单位毫秒
unsigned int sleep(unsigned int seconds); // POSIX系统,seconds单位秒
注意
POSIX
系统(如Linux
和macOS
)—— 使用#include <unistd.h>
和sleep()
,单位秒
Windows
系统 —— 使用#include <windows.h>
和Sleep()
,单位毫秒