当我在 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()
and之间进行fcntl()
。
如何解决这个问题?