
私は2つのプロセスの間に信号を送る学校の課題を進めています。プロセス1はプロセス2に信号を送り、プロセス2はSIGUSR1を再びプロセス1に送り、元の信号を確認する。
プロセス2では、通常はsigsuspend
SIGUSR1を待ちますが、SIGUSR1のハンドラを設定しないと、関数が無期限にブロックされることがわかりました。仮想ハンドラを設定した後、sigsuspensionは正しく機能しました。
続行する前にスタンバイメカニズムとしてシグナルを使用する場合、なぜ仮想ナンドラーを定義する必要がありますか?
答え1
POSIX規格ではsigsuspend
mask
シグナルハンドラが入力されていない信号をキャプチャした場合にのみ返すように単純に定義しました。
sigsuspens()関数は、呼び出しスレッドの現在のシグナルマスクをsigmaskが指すシグナルセットに置き換えてから、シグナルが渡されるまでスレッドを一時停止する必要があります。これは、シグナルキャプチャー機能を実行するかプロセスを終了することです。 [… ]
ジョブがプロセスを終了する場合、sigsuspens() は決して返されません。ジョブがシグナルキャプチャ関数を実行する場合、sigsuspens() はシグナルキャプチャ関数が返された後に返され、sigsuspens() 呼び出しの前に存在したセットにシグナルマスクを復元する必要があります。
sigsuspend
信号は通常の信号処理によっても処理されます。
- 無視された信号はプロセスを正常に中断しないため、
sigsuspend
戻りは発生しません。 - 終了信号は、プロセスを終了して
sigsuspend
戻らないようにします。 - ハンドラを持つ信号はハンドラを実行してからプログラムの実行を再開するため、
sigsuspend
ハンドラが完了した後に返されることがあります。
通常、(少なくともLinux、FreeBSD、およびMac OS Xでは)SIGUSR1
プロセスを終了する必要があるため、プロセス2は無期限のブロックではなく終了する必要があります。もしsignal(SIGUSR1, SIG_IGN)
どこかで使ったことがありますか?