当我在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()
来设置。而这不是原子方式 - 一些线程可能会在调用socket()
和fcntl()
之间执行exec()
。如何解决这个问题?