ソケットペアを信号安全バッファとして使用できますか?

ソケットペアを信号安全バッファとして使用できますか?

シグナルハンドラとメインプログラムがどのように通信するのか悩んでいます。私は主に非ブロック信号(信号ハンドラが実行されても新しい信号が到着する可能性があります)を使用しているため、ロックフリーのソリューションを探しています。

現在私の考えはこんな感じです。

  1. socketpair(...)シグナルハンドラを取り付ける前にYet(使用)を作成してくださいsigaction(...)
  2. シグナルハンドラは、私が実行する必要があるすべてを対応するソケットペアのファイル記述子に送信します。
  3. 基本プロセスは、他のファイル記述子から着信データをポーリングし、必要に応じて処理します。

もちろん、内部バッファサイズをかなり高く設定し(を使用して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()

おすすめ記事