linux提供了许多功能,以在创建时制作文件描述符close-on-exec
。
int efd = eventfd(0, O_CLOEXEC);
int sfd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
...
我的问题是:这种机制线程安全吗?如果一个线程叉同时另一个线程称这些功能创建FD怎么办?我会遇到文件 - 描述器泄漏问题吗?
这是CLOEXEC
标志的全部点:使得无法获得这种比赛。该标志一直传递到内核,因此,当创建FD时,它已经在其上设置了cloexec标志。这是一个例子。假设我们有两个线程。线程1打开FD,然后使用单独的fcntl
系统调用在其上设置CLOEXEC
标志。线程2在调用open
和fcntl
之间的叉子。我们有一个FD泄漏。
如果线程1取而代之的是将CLOEXEC
传递到open
(或socket
)呼叫中,则解决了赛车。如果螺纹2叉在open
之前,则没有FD,因此没有泄漏。如果之后,则FD将被关闭,因为它已经标记为CLOEXEC
。