シグナルハンドラで非同期シグナルセーフ関数のみを呼び出しますか? [閉鎖]

シグナルハンドラで非同期シグナルセーフ関数のみを呼び出しますか? [閉鎖]

私はシグナルとシグナルハンドラに初めて触れ、次の本を読んでいます。

ハンドラでは、非同期信号安全関数のみを呼び出します。非同期信号安全または単純安全関数には、信号ハンドラによって中断できないという点で、信号ハンドラから安全に呼び出すことができるという属性があります。 printf、sprintf、malloc、シャットダウンなどの広く使用されている多くの機能は安全ではありません。

私はここで少し混乱しています。私の質問は次のとおりです。

安全機能がシグナルハンドラによって中断できないことはどういう意味ですか?これは、安全機能の開始時に内部的に信号を遮断し、完了する前に信号遮断を解除して、安全機能が他の信号によって中断されないことを意味しますか?

ベストアンサー1

カーネルがプロセスにシグナルを渡すときにプロセスの実行を停止し(プロセスがどこにいても)、シグナルハンドラ関数への呼び出しを挿入してから、シグナルハンドラを実行するようにプロセスをスケジュールします。呼び出しはどこでも注入できるため、シグナルハンドラが注入されたときにプログラムがローカルでない状態を操作できます。この非ローカル状態に依存する他の関数を呼び出すと、未定義の動作が発生します。

非ローカル状態にアクセス/変更するすべての機能は、通常信号から安全ではありません。からman 7 signal-safety

To avoid problems with unsafe functions, there are two possible
choices:

1. Ensure that (a) the signal handler calls only async-signal-safe
   functions, and (b) the signal handler itself is reentrant with
   respect to global variables in the main program.

2. Block signal delivery in the main program when calling functions
   that are unsafe or operating on global data that is also accessed by
   the signal handler.

Generally, the second choice is difficult in programs of any complexity,
so the first choice is taken.

マニュアルページには、シグナルセーフ機能セットが引き続き表示されます。

おすすめ記事