C++温故补缺(十四):信号处理

信号处理

信号是由操作系统传给进程的中断,能够提前终止一个程序。在Unix,Linux,Mac OS 或Windows系统上,都可以通过Ctrl+C产生中断。

下面是可以在程序中被捕获的信号,并且可以基于信号采取适当的动作,这些信号定义在C++头文件<csignal>中。

信号描述
SIGABRT程序的异常终止,如调用 abort
SIGFPE错误的算术运算,比如除以零或导致溢出的操作。
SIGILL检测非法指令。
SIGINT程序终止(interrupt)信号。
SIGSEGV非法访问内存。
SIGTERM发送到程序的终止请求。

signal函数

signal函数用来捕获突发事件,signal语法:

signal (registered signal,signal handler)

函数的第一个参数是一个整数,代表了信号的编号,第二个参数一个指向信号处理函数的指针,也就是要把一个函数传进去当参数。例子:

#include<iostream>
#include<csignal>
#include<unistd.h>

using namespace std;

void signalHandler(int signum){
    cout<<"Interrupt signal:"<<signum<<endl;
    exit(signum);
}
int main(){
    signal(SIGINT,signalHandler);
    int x;
    cout<<"Press Ctrl C"<<endl;
    cin>>x;
}

signal()的第一个参数是定义好的可以捕获的信号,如上SIGINT就是用来捕获交互注意信号的。可以在VS中查看定义:

该头文件给出了这几个信号的宏定义以及解释,可以看到它们是一些整数

signal()的第二个参数是捕获到信号后用来执行动作的函数,其参数就是前面该信号的整型值。

运行:

就捕获到了这个信号,并输出提示语句

ps:捕捉信号不能用run and debug,只能先编译,然后在终端运行

raise()函数

raise()函数用来主动生成信号,参数为一个整数

int raise(signal sig);

例子:

#include<iostream>
#include<csignal>
#include<unistd.h>

using namespace std;

void signalHandler(int signum){
    cout<<"Interrupt signal:"<<signum<<endl;
    exit(signum);
}
int main(){
    signal(SIGINT,signalHandler);
    int i=-1;
    if(i<0){
        raise(SIGINT);
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值