C++ | 高级教程 | 信号处理

👻 概念

  • 信号 —— 操作系统传给进程的中断,会提早终止程序
  • 有些信号不能被程序捕获,有些则可以被捕获,并基于信号采取适当的动作
信号描述
SIGABRT程序的异常终止,如调用 abort
SIGFPE错误的算术运算,比如除以零或导致溢出的操作
SIGILL检测非法指令
SIGINT程序终止 (interrupt) 信号
SIGSEGV非法访问内存
SIGTERM发送到程序的终止请求

👻 准备工作

使用信号处理需要包含 <csignal> 头文件:

#include <csignal>

👻 捕获信号

👾语法格式

使用 signal() 函数 捕获信号

void signal(registered signal, signal handler)
  • 参数 signal —— 要设置信号的标识符

  • 参数 handler —— 指向信号处理函数的指针,函数返回值是指向先前信号处理函数的指针:

    • 先前没有设置信号处理函数,返回值为 SIG_DFL
    • 先前设置的信号处理函数为 SIG_IGN,则返回值为 SIG_IGN

👾示例代码

  • 使用 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 —— 要发送的整数信号编号,包括 SIGINTSIGABRTSIGFPESIGILLSIGSEGVSIGTERMSIGHUP

👾示例代码

  • 使用 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系统(如LinuxmacOS)—— 使用 #include <unistd.h>sleep() ,单位秒

    • Windows系统 —— 使用 #include <windows.h>Sleep() ,单位毫秒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值