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()and之间进行fcntl()

如何解决这个问题?

4

0 回答 0