Linux でソケットを作成する場合、O_CLOEXEC
作成時にフラグを指定することができます。
auto fd = socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, 0);
したがって、このソケットが開いたままの状態で他のスレッドがfork()
+を実行することはありません。exec()
しかし、Mac では、マニュアルによると、同じトリックを行うことはできません。
ソケットには、通信のセマンティクスを指定する指定されたタイプがあります。現在定義されている型は: SOCK_STREAM SOCK_DGRAM SOCK_RAW SOCK_SEQPACKET SOCK_RDM
フラグO_CLOEXEC
は への呼び出しでのみ設定できますfcntl()
。そして、それはアトミックな方法ではありません - 一部のスレッドは と への呼び出しの間に行うことができexec()
ます。socket()
fcntl()
この問題を解決するにはどうすればよいですか?