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); } }