sigsuspend関数は,プロセスのシグナル・マスクを,
signal_mask 引数がポイントするシグナルのセットに置き換えます。その後,アクションとしてシグナル・キャッチ関数を実行するか,プロセスを終了させるシグナルが配信されるまで,プロセスの実行を中断します。
sigsuspend関数では, SIGKILL シグナルや SIGSTOP シグナルをブロックすることはできません。プログラムがこれらのシグナルのブロックを試みた場合でも,
sigsuspendはエラーを発生させません。
シグナルの配信によってプロセスが終了する場合,
sigsuspendは返りません。シグナルの配信によってシグナル・キャッチ関数が実行される場合,
sigsuspendはシグナル・キャッチ関数が返った後に返り,シグナル・マスクは
sigsuspendの呼び出しの前のセットに復元されます。
sigsuspend関数は,1 つのアトミックな操作として,シグナル・マスクを設定し,ブロックされていないシグナルを待ちます。つまり,マスクの設定とシグナルを待つ操作の間にシグナルを発生させることはできません。プログラムが
sigprocmaskSIG_SETMASK と
sigsuspendを別々に呼び出した場合,これらの関数の間に発生したシグナルは,通常は
sigsuspendには意識されません。
通常の用途では,シグナルはクリティカル・セクションの先頭で,
sigprocmask関数を使ってブロックされます。その後,プロセスは実行すべき作業があるかどうかを調べます。作業がなければ,プロセスは,前に
sigprocmaskから返されたマスクを使って
sigsuspendを呼び出して,作業を待ちます。
シグナルが呼び出し元プロセスによってキャッチされ,制御がシグナル・ハンドラから返った場合,呼び出し元プロセスは
sigsuspendの後から実行を再開します。
sigsuspendはつねに値 - 1 を返し,
errnoを EINTR に設定します。
sigpauseと
sigprocmaskも参照してください。