コマンド ライン アプリケーションが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
への呼び出しを追加しました。それはうまくいくようです。sigprocmask
sigwait