軽率なことを言っているのではなく、本当に理解できないのです。ただ、それらに関する資料を大量に読んだのですが、使用例がわかりません。signal() などに比べて利点が十分に明らかな API についてはあまり話していません。むしろ、RT シグナルはユーザー空間で生成されることを意図しているようですが、その目的は何なのでしょうか? 唯一の用途はプリミティブな IPC のようですが、すべてが、それらが IPC のひどい形式であることを示しています (たとえば、扱いにくい、情報が限られている、特に効率的ではないなど)。
では、どこでどのように使用されるのでしょうか?
ベストアンサー1
まず、Ben の答えが正しいことに注意してください。私が知る限り、POSIX におけるリアルタイム シグナルの目的は、AIO、メッセージ キュー通知、タイマーの有効期限、およびアプリケーション定義シグナル (内部およびプロセス間の両方) のリアルタイム配信メカニズムとしての機能です。
そうは言っても、シグナルは一般的に物事を行う方法としては非常に悪いです。
- シグナル ハンドラーは非同期であり、非同期シグナル安全でない関数を中断しないことを保証しない限り、非同期シグナル安全な関数しか使用できず、実行できることが大幅に制限されます。
- シグナルハンドラはグローバル状態です。ライブラリは、どのシグナルが使用できるか、それらをシステムコール割り込みにできるかなど、呼び出しプログラムとの契約なしにシグナルを使用することはできません。そして一般的に、グローバル状態は悪いこと。
sigwait
シグナルを処理するためにシグナル ハンドラーではなく(または Linux拡張機能)を使用する場合signalfd
、それらは他の IPC/通知メカニズムよりも優れているわけではなく、さらに悪くなる可能性があります。
非同期 IO は、設計が不適切な POSIX AIO API を無視し、通常のブロッキング IO を実行するスレッドを作成して、操作が終了したらpthread_cond_signal
または を呼び出すだけで、はるかにうまく実現できます。または、パフォーマンス コストを少し許容できる場合は、パイプまたはソケット ペアを介して読み取ったばかりのデータを自分自身に転送し、ソケット/パイプ/tty の場合と同じように、 またはsem_post
を使用して、メイン スレッドで非同期に読み取った通常のファイルを処理することもできます。select
poll