あるシグナルハンドラが別のシグナルハンドラによって中断されたときの2つ(≥2)のシグナルハンドラの実行順序は何ですか?

あるシグナルハンドラが別のシグナルハンドラによって中断されたときの2つ(≥2)のシグナルハンドラの実行順序は何ですか?

mainandに2つの信号ハンドラを登録するとします。ランタイム信号が届いたらどうなりますか?SIGUSR1SIGUR2sig_ur1sig_ur2SIGUR2sig_ur1

sig_ur1実行--->信号SIGUR2到着---->:

  1. sig_ur1継続実行 - >sig_ur1完了 - >sig_ur2実行開始 - >sig_ur2完了 - >復帰main

  2. sig_ur2走り始め ->sig_ur2終了 ->復帰main

  3. sig_ur2実行開始 - >sig_ur2終了 - >再開(変数はsig_ur1終了時に同じ値を保持します) - >終了 - >復帰sig_ur1sig_ur1main

  4. sig_ur2実行開始 - >終了sig_ur2- >sig_ur1再起動(すべての変数が再初期化される) - >終了sig_ur1- >復帰main

どんなオプションが正しいですか?それとも両方が間違っていますか?この問題を扱った記事/投稿を見つけることができなかったので、関連資料/リンクを教えていただきありがとうございます。 :)

ベストアンサー1

シナリオ3はデフォルトで発生します。ただし、SIGUSR1 のハンドラの実行中に SIGUSR2 をブロックできるため、シナリオ 1 が発生します。シグナルハンドラを取り付けるとき、シグナルハンドラの実行時にブロックする信号を指定できます。

参考までに、オペレーティングシステムのマンページから信号を読むことをお勧めします。たとえば、Linuxでは、man 7 signal「See Also」のマニュアルページを表示できます。

ただし、動作を直接確認することはできます。長いスリープモード(3)に入るSIGUSR1用のハンドラを作成するだけです(SIGALRMを介してスリープ(3)が可能なので、Linuxではnanosleep(2)が優れています)。その後、SIGUSR1が最初に送信されます。そしてSIGUSR2。

おすすめ記事