シグナルハンドラとメインプログラムがどのように通信するのか悩んでいます。私は主に非ブロック信号(信号ハンドラが実行されても新しい信号が到着する可能性があります)を使用しているため、ロックフリーのソリューションを探しています。
現在私の考えはこんな感じです。
socketpair(...)
シグナルハンドラを取り付ける前にYet(使用)を作成してくださいsigaction(...)
。- シグナルハンドラは、私が実行する必要があるすべてを対応するソケットペアのファイル記述子に送信します。
- 基本プロセスは、他のファイル記述子から着信データをポーリングし、必要に応じて処理します。
もちろん、内部バッファサイズをかなり高く設定し(を使用してsetSockOptInt(SOL_SOCKET, SO_SNDBUF, size);
)、オーバーフロー時にプログラムを適切に終了する予定です(send(...)
シグナルハンドラから何かを返すことは不可能です...)。
シグナルセーフlibc機能は非常に厳密に制限されているため、Posix.*の標準に違反する可能性があると思います。しかし、私が知っている限り、ソケットに書くのは原子的です(send()
データグラムソケットを使用している場合はほぼ100%そうであると確信しています)。
そうなんですか?できますか?
答え1
信号コンテキストで安全な機能のリストについてはを参照してくださいman 7 signal-safety
。このページでは:
The set of functions required to be async-signal-safe by POSIX.1 is shown in the following table. The functions not otherwise noted were required to be async-signal-safe in POSIX.1-2001; the table details changes in the subsequent standards. Function Notes ... send(2) sendmsg(2) sendto(2) ... write(2)
したがって、ソケットに関連するファイルディスクリプタ(またはその問題のすべてのファイルディスクリプタ)でまたはを使用することはsend()
安全です。write()