私は通常、一時停止して信号を取得した後に何かをするデーモンをプログラムしました(私はそれを別のプロセスに起動するためにSIGHUPを使用します)。シグナルの処理中に同じシグナルをブロックする方法は?
ここに私のコードです。
...
static volatile sig_atomic_t saw_hup = 0;
static void sighup_handler(int s)
{
saw_hup = 1;
}
int main(void)
{
struct sigaction act_new;
...
sigemptyset(&act_new.sa_mask);
act_new.sa_handler = sighup_handler;
sigaction(SIGHUP, &act_new, NULL);
while(1) {
saw_hup = 0;
pause();
if(saw_hup) {
do_section_A();
}
}
}
限り、私はそれをテストしてきたように)、信号のためのいくつかのスタックがあるようですので、セクションAの実行時に発生する信号は、(一時停止から起床デーモンを行い、再びセクションAを実行します直前のセクションAを終了した直後。
しかし、次のSIGHUP信号をブロックし、セクションAをもう一度実行しないようにします。私が望むのは、前のSIGHUPシグナルによって実行されたセクションAの途中を除いて、SIGHUPが起こるたびにセクションAを実行することです。それ、どうやったら出来るの?
セクションAの実行途中でセクションAの実行がセクションSの実行直後に再び実行されるという問題があると思います。
は、ここに私の修正コード私が望んでいたように動作するようです
...
static volatile sig_atomic_t saw_hup = 0;
static void sighup_handler(int s)
{
saw_hup = 1;
}
int main(void)
{
struct sigaction act_new;
...
sigemptyset(&act_new.sa_mask);
act_new.sa_handler = sighup_handler;
sigaction(SIGHUP, &act_new, NULL);
while(1) {
saw_hup = 0;
pause();
if(saw_hup) {
do_section_A();
}
}
}
です。誰もこのコードに何か問題があると思いますか?
セクションAをシグナルハンドラに移動しないのはなぜですか? – user3528438
セクションAをシグナルハンドラに移動しようとしました。ハンドラ実行中に新しいSIGHUP信号が発生した場合は、直前のシグナルのハンドラ関数を終了した後で再びシグナルハンドラを実行します。私が望むのは、次の信号がpause()を起こさないようにすることです。 –
http://stackoverflow.com/questions/5285414/signal-queuing-in-c – user3528438