GNU/Linux >> Linux の 問題 >  >> Linux

C でのシグナル キューイング

同じタイプの複数のシグナルが送信され、処理されない場合、それらはキューに入れられません。プログラムが SIGUSR1 をマスクするとします。 、 kill(getpid(), SIGUSR1) を呼び出します 10回でSIGUSR1のマスクを外す . SIGUSR1 を受け取ります


何が起こるかは次のとおりです:

<オール>
  • 受信した最初のシグナル、つまり SIGUSR1、ハンドラが呼び出されて実行中
  • 2 番目のシグナルを受信しました。nr1 からのハンドラーがまだ実行されているため、シグナル nr2 は保留されてブロックされます。
  • 3 番目のシグナルを受信しました。nr1 からのハンドラーがまだ実行中であるため、シグナル 3 は破棄されます。
  • 信号 nr1 と同じタイプの 4 番目、5 番目などの信号は破棄されます。
  • シグナル ハンドラーがシグナル nr1 の処理を​​完了すると、シグナル nr2 を処理し、次にシグナル ハンドラーが SIGUSR2 を処理します。

    基本的に、同じタイプの保留中のシグナルはキューに入れられず、破棄されます。いいえ、そのように信号を「バースト」送信する簡単な方法はありません。破棄されるいくつかのシグナルが存在する可能性があると常に想定し、ハンドラーにクリーニングと何をすべきかを見つけさせようとします (すべての子が同時に死亡した場合、子を刈り取るなど)。


    Linux
    1. Linux シグナルの基礎 – パート I

    2. Python - すべてのシグナルをトラップする

    3. SIGSEGV をキャッチするシグナルハンドラを作成するには?

    1. UNIX/Linux シグナル処理:SIGEV_THREAD

    2. Linux C:シグナルを受信すると、送信者の PID を知ることは可能ですか?

    3. Ctrl-C で Python C 拡張を中断できるようにする

    1. シグナルハンドラでprintfを使用しないようにするには?

    2. どのスレッドがシグナルを処理しますか?

    3. Bluetooth LE 信号強度 Linux