是开放线程安全上的O_Cloexec



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在调用openfcntl之间的叉子。我们有一个FD泄漏。

如果线程1取而代之的是将CLOEXEC传递到open(或socket)呼叫中,则解决了赛车。如果螺纹2叉在open之前,则没有FD,因此没有泄漏。如果之后,则FD将被关闭,因为它已经标记为CLOEXEC

相关内容

  • 没有找到相关文章

最新更新