2
#include <iostream>
#include <signal.h>
#include <unistd.h>

using namespace std;

void sighandler(int sig) {
    cout << "signal received" << endl;
}

int main() {

    int pid= getpid();
    cout << pid << endl;

    signal( SIGUSR1, sighandler );

    sigset_t accept;
    sigaddset( &accept, SIGUSR1 );
    int s;

    sigwait(&accept, &s);

    cout << s << endl;

    return 0;
}

このプログラムを実行し、「kill -s SIGUSR1 $ pid」を介してSIGUSR1シグナルを送信すると、シグナルの番号(10)が出力されますが、sighandlerのテキストは出力されません。理由がわかりません。これはLinuxシステム上にあります。

4

3 に答える 3

6

からsigwait - wait for queued signals

説明

sigwait() 関数は set から保留中のシグナルを選択し、システムの保留中のシグナルのセットからそれをアトミックにクリアし、 sig によって参照される場所にそのシグナル番号を返します。

したがって、 を使用するsigwait()と、シグナルはすでに配信され、プログラムによって処理されます。

通話を外してsigwaitスリープまたはビジー待機を行うと、SIGUSR1シグナルがシグナルハンドラーに配信され、「シグナルを受信しました」というメッセージが出力されます。

于 2013-03-05T20:31:03.660 に答える
3

呼び出すsigwait()とスレッドがスリープ状態になり、制御が OS に渡されるため、この動作が発生します。シグナルを送信するSIGUSR1と、OS によって処理され、OS がスレッドを起動して制御を戻します。シグナル ハンドラーを登録しても、スレッドが再起動されるまでにシグナルが処理されているため、ハンドラーは呼び出されません。

于 2013-03-05T20:32:53.447 に答える
1

決定的な参照を見つけようとしていますが、シグナル ハンドラー とsigwaitは相互に排他的であるようです。を使用してシグナルを同期的に処理する場合sigwait、ハンドラは呼び出されません。

議論については、sigwait() のあいまいな説明についてを参照してください。

于 2013-03-05T20:31:11.900 に答える