file-descriptor - 打开的 O_CLOEXEC 是线程安全的吗?

标签 file-descriptor

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

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

我的问题是:这个机制是线程安全的吗?如果一个线程同时派生另一个线程调用这些函数来创建 fd,会怎样?我会遇到文件描述符泄漏问题吗?

最佳答案

这就是 CLOEXEC 标志的全部要点:使这种竞争变得不可能。该标志一直传递到内核,因此当创建 fd 时,它已经设置了 CLOEXEcflags。这是一个例子。假设我们有两个线程。线程 1 打开一个 fd,然后使用单独的 fcntl 系统调用在其上设置 CLOEXEC 标志。线程 2 在 openfcntl 调用之间 fork 。我们有一个 fd 泄漏。

如果线程 1 将 CLOEXEC 传递到 open(或 socket)调用中,则竞争将得到解决。如果线程 2 在 open 之前 fork ,则没有 fd,因此不会泄漏。如果它之后 fork ,fd 将被关闭,因为它已经被标记为 CLOEXEC

关于file-descriptor - 打开的 O_CLOEXEC 是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47641943/

相关文章:

linux - 获取打开文件描述符的内存使用情况

c - 如何使用带有索引的struct在c中使用文件描述符或系统调用来读写文件和处理文件

使用 copy_file_range 进行复制加速

c++ - 给定文件描述符如何 : Obtain the device node of the device containing a file,

c - C中选择,为什么会失败?

java - java程序中的文件描述符泄漏: too many open files

c - 设置了 O_NONBLOCK 的套接字 fd 的多次读取调用失败

python - 如何找到有关文件描述符的更多信息?

bash - 具有文件描述符的重复 IO

node.js - 类型错误 : fs/promises read is not a function