可靠地测试一个信号是否已经到达的唯一方法是在阻塞信号下进行测试_例子

volatile sig_atomic_t flag = 0; void termination_handler(int signum) { flag = 1; } int main(void) { struct sigaction new_action,old_action; sigset_t block_ctrl; new_action.sa_handler = termination_handler; //清空信号集操作 sigemptyset(&new_action.sa_mask); //添加信号集 sigaddset(&new_action.sa_mask,SIGINT); new_action.sa_flags = 0; //使程序对ctrl+c进行信号处理 sigaction(SIGINT,NULL,&old_action); if(old_action.sa_handler != SIG_IGN) sigaction(SIGINT,&new_action,NULL);//捕获ctrl+c while(1) { //可靠地测试一个信号是否已经到达的唯一方法是在阻塞信号下进行测试. //避免执行完if(flag)之后信号到达,导致执行行为不准确 sigprocmask(SIG_BLOCK,&new_action.sa_mask,NULL); if(flag) { flag = 0; printf("完成关键操作开始!/n/n"); sleep(2); printf("完成关键操作结束!/n/n"); break; } sigprocmask(SIG_UNBLOCK,&new_action.sa_mask,NULL); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值