1

コマンド ライン アプリケーションが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」が 2 番目の後にのみ呼び出されCtrl-Cます。最初に初期化解除コードを実行するにはどうすればよいCtrl-Cですか? Ubuntu 13.04 x64 を使用しています。

編集:わかりました、私はこれを理解したようです。捨ててbeforesigactionへの呼び出しを追加しました。それはうまくいくようです。sigprocmasksigwait

4

0 に答える 0