シグナル (Unix)
ハンドラによるシグナル処理は競合状態に弱い。シグナルは非同期イベントなので、あるシグナルをハンドラで処理中に別のシグナル(同じ種類ということもある)がそのプロセスに送られてくることがある。このような状態を防ぐため、sigprocmask()(英語版) を使ってシグナル配送のブロック/アンブロックが可能である。
シグナルは処理中のシステムコールを中断することがあり、その際にアプリケーションは非透過的な再実行をしなければならない場合がある。この場合、実行中のシステムコールはEINTRというエラーを返し、要求した処理はシグナル受信によって中断されて結果を得られていないことを示す。この場合、処理を続行するには再度同じシステムコールを実行しなければならない。一方、4.2BSDにて、システムコールがシグナル受信のために中断後、ユーザプロセスの介在なく直ちに再開できる場合は内部でエラーERESTARTを返し、シグナルハンドラの実行後システムコールの呼び出し元には戻らず、透過的にシステムコールを継続できるようになった。ERESTARTはカーネル内部でのみ使用されるエラー値であり、ユーザプロセスへは返さない。
シグナルハンドラは通常の処理に割り込んで呼び出されるので、不要な副作用を起こさないように注意が必要である。以下は具体例。
シグナルハンドラは再入可能な処理のみ行う。特に、malloc、printfといった非同期シグナル安全(async‐signal‐safe)でない関数を使うのは安全ではない。
再入不可能な処理を実行する場合、それが終了するまでシグナルをマスクし、シグナル受信処理を遅らせる。
大域変数 errno の変更など、割り込まれた処理が予期していない変更を含む処理をしない。