sigsuspensionが返されるようにハンドラを定義する必要があるのはなぜですか?

sigsuspensionが返されるようにハンドラを定義する必要があるのはなぜですか?

私は2つのプロセスの間に信号を送る学校の課題を進めています。プロセス1はプロセス2に信号を送り、プロセス2はSIGUSR1を再びプロセス1に送り、元の信号を確認する。

プロセス2では、通常はsigsuspendSIGUSR1を待ちますが、SIGUSR1のハンドラを設定しないと、関数が無期限にブロックされることがわかりました。仮想ハンドラを設定した後、sigsuspensionは正しく機能しました。

続行する前にスタンバイメカニズムとしてシグナルを使用する場合、なぜ仮想ナンドラーを定義する必要がありますか?

ベストアンサー1

POSIX規格ではsigsuspendmaskシグナルハンドラが入力されていない信号をキャプチャした場合にのみ返すように単純に定義しました。

sigsuspens()関数は、呼び出しスレッドの現在のシグナルマスクをsigmaskが指すシグナルセットに置き換えてから、シグナルが渡されるまでスレッドを一時停止する必要があります。これは、シグナルキャプチャー機能を実行するかプロセスを終了することです。 [… ]

ジョブがプロセスを終了する場合、sigsuspens() は決して返されません。ジョブがシグナルキャプチャ関数を実行する場合、sigsuspens() はシグナルキャプチャ関数が返された後に返され、sigsuspens() 呼び出しの前に存在したセットにシグナルマスクを復元する必要があります。

sigsuspend信号は通常の信号処理によっても処理されます。

  • 無視された信号はプロセスを正常に中断しないため、sigsuspend戻りは発生しません。
  • 終了信号は、プロセスを終了してsigsuspend戻らないようにします。
  • ハンドラを持つ信号はハンドラを実行してからプログラムの実行を再開するため、sigsuspendハンドラが完了した後に返されることがあります。

通常、(少なくともLinux、FreeBSD、およびMac OS Xでは)SIGUSR1プロセスを終了する必要があるため、プロセス2は無期限のブロックではなく終了する必要があります。もしsignal(SIGUSR1, SIG_IGN)どこかで使ったことがありますか?

おすすめ記事