8

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()

この問題を解決するにはどうすればよいですか?

4

0 に答える 0