我需要命令行应用程序在主线程中等待 Ctrl-C ,然后执行一些取消初始化代码并退出。
我使用以下测试程序测试了这个场景:
#include <unistd.h>
#include <signal.h>
#include <cstdlib>
#include <cstdio>
#include <cassert>
using namespace std;
void control_break_handler(int) { printf("\ncontrol_break_handler\n"); }
int main()
{
printf("%s", "Before signal\n");
int result = 0;
struct sigaction sigact = {};
result = sigemptyset(&sigact.sa_mask);
assert(result == 0);
sigact.sa_handler = &control_break_handler;
sigact.sa_flags = 0;
result = sigaction(SIGINT, &sigact, NULL);
assert(result == 0);
sigset_t set;
result = sigemptyset(&set);
assert(result == 0);
result = sigaddset(&set, SIGINT);
assert(result == 0);
int sig;
result = sigwait(&set, &sig);
assert(result == 0);
printf("\nsigwait returned %d, sig = %d\n", result, sig);
sleep(10);
return 0;
}
但它只是打印
sigwait returned 0, sig = 2
在第一个 Ctrl-C 之后,“control_break_handler”仅在第二个 Ctrl-C 之后调用。 如何在第一个 Ctrl-C 上执行取消初始化代码? 我使用的是Ubuntu 13.04 x64。
编辑:好的,好像我想出来了。我扔掉sigaction
并在sigprocmask
之前添加了对sigwait
的通话。它似乎工作得很好。