0

SIGUSR2 と SIGUSR1 をそれぞれ使用して、プロセスをブロックおよびウェイクする必要があります。以下は、私のシグナルハンドラサブルーチンです。一時停止によってブロックされたプロセスを起動するにはどうすればよいですか?

void sig_handler(int sig) { 
    static int i = 1;
    if(sig == SIGUSR2) {
    pause();
    }
    else if(sig == SIGUSR1) {
/* I don't what to write here */
    }
}

また、pause() は良いプログラミング手法ではないことをどこかで読みましたが、プロセスをしばらく中断する他の手段はありますか?

4

2 に答える 2

0

このページを見る

一般に、シグナルで多くの作業を行うのは...注意が必要です。非同期信号に対して安全ではないものもあるため、そこでの堅牢なプログラミングは少し難しくなります。あなたの場合、pause()はシグナルが到着するのを待ちますが、シグナルハンドラーからそれを呼び出しているので、そこでは機能しません(私は思います)。

プロセスをスリープ状態にし、シグナルで再開することについて。上でリンクしたページを見てください。最良の方法は、シグナルハンドラーにフラグを設定させ、メインスレッド(つまり、main()またはイベントループ内)にこれらのフラグに反応させることです。このページで推奨されているように、SIGUSR2を受信したときにsigsuspendを使用して、SIGURS1を受信するまでプロセスを一時停止します。

于 2012-09-17T06:27:58.830 に答える
0

それは簡単です。「kill」システムコールを使用します-

void sig_handler(int sig) { 
    static int i = 1;
    if(sig == SIGUSR2) {
    pause();
    }
    else if(sig == SIGUSR1) {
        kill(<pid of process to wake up>, sig);
        // make sure that process with pid has registered for sig
    }
}
于 2016-05-18T05:00:46.317 に答える