Linux提供了许多函数来在创建时创建文件描述符close-on-exec
。
int efd = eventfd(0, O_CLOEXEC);
int sfd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
...
我的问题是:这种机制是线程安全的吗?如果一个线程同时分叉另一个线程调用这些函数来创建fds怎么办?我会遇到文件描述符泄漏问题吗?
答案 0 :(得分:1)
这是CLOEXEC
旗帜的重点:让这种种族无法进行。该标志一直传递到内核,因此当创建fd时,它已经设置了CLOEXEC标志。这是一个例子。假设我们有两个主题。线程1打开一个fd,然后使用单独的CLOEXEC
系统调用在其上设置fcntl
标志。线程2在对open
和fcntl
的调用之间分叉。我们有一个fd泄漏。
如果线程1将CLOEXEC
传递到open
(或socket
)来电,则会解决比赛问题。如果线程2在open
之前分叉,那么就没有fd,所以没有任何泄漏。如果它之后,fd将被关闭,因为它已被标记为CLOEXEC
。