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 在 open
和 fcntl
调用之间 fork 。我们有一个 fd 泄漏。
如果线程 1 将 CLOEXEC
传递到 open
(或 socket
)调用中,则竞争将得到解决。如果线程 2 在 open
之前 fork ,则没有 fd,因此不会泄漏。如果它之后 fork ,fd 将被关闭,因为它已经被标记为 CLOEXEC
。
关于file-descriptor - 打开的 O_CLOEXEC 是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47641943/