为什么SIGINT处理程序在我的代码中不起作用?

时间:2013-07-31 10:13:46

标签: c++ linux ubuntu signals

我需要命令行应用程序在主线程中等待 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的通话。它似乎工作得很好。

0 个答案:

没有答案