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()
この問題を解決するにはどうすればよいですか?