printfが非同期信号安全機能ではないのはなぜですか?

printfが非同期信号安全機能ではないのはなぜですか?

我々は、これが非同期printf信号安全機能ではないことを知っています。以下は私の基本的な理解です。

printfinメソッドを呼び出してmain内容がstdioバッファに書き込まれたと仮定すると、バッファがファイルにフラッシュされる直前にシグナルが到着し、シグナルハンドラも呼び出されますprintf。 2 番目のハンドラはprintfその内容をバッファに追加し、buffer の最初の呼び出しと 2 番目の呼び出しの内容が一致しないため無効なので、シグナル ハンドラで非同期でない安全関数を使用することはできません。私の理解は正しいですか?

私の理解が正確であれば、非同期安全機能はこの問題をどのように解決しますか?安全な関数はまだ呼び出しのための貴重なバッファデータを含むことができるバッファを処理する必要があるため?

ベストアンサー1

printf説明したように、同期せずにグローバル状態を操作するため、非同期信号は安全です。楽しみを加えるために再入口は必要ありません。あなたの例では、シグナルはprintf最初のランタイムによって処理される可能性がありますが、2番目のシグナルは最初の呼び出しの状態を台無しにする可能性がありますprintf

非同期信号を安全に使用するための推奨される方法は、シグナルハンドラがどこかにフラグを設定し、基本プログラムフローにフラグを処理させることです。これは、再入、直列化された出力の問題を防ぎ、信号ハンドラをすばやく維持するのに役立ちます。

おすすめ記事