O_CLOEXEC是否开放线程安全?

时间:2017-12-04 21:05:11

标签: file-descriptor

Linux提供了许多函数来在创建时创建文件描述符close-on-exec

int efd = eventfd(0, O_CLOEXEC);
int sfd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
...

我的问题是:这种机制是线程安全的吗?如果一个线程同时分叉另一个线程调用这些函数来创建fds怎么办?我会遇到文件描述符泄漏问题吗?

1 个答案:

答案 0 :(得分:1)

这是CLOEXEC旗帜的重点:让这种种族无法进行。该标志一直传递到内核,因此当创建fd时,它已经设置了CLOEXEC标志。这是一个例子。假设我们有两个主题。线程1打开一个fd,然后使用单独的CLOEXEC系统调用在其上设置fcntl标志。线程2在对openfcntl的调用之间分叉。我们有一个fd泄漏。

如果线程1将CLOEXEC传递到open(或socket)来电,则会解决比赛问题。如果线程2在open之前分叉,那么就没有fd,所以没有任何泄漏。如果它之后,fd将被关闭,因为它已被标记为CLOEXEC