man 2 open
man eventfd
O_CLOEXEC (since Linux 2.6.23)
Enable the close-on-exec flag for the new file descriptor. Specifying this flag permits a program to avoid additional fcntl(2) F_SETFD
operations to set the FD_CLOEXEC flag.
Note that the use of this flag is essential in some multithreaded programs, because using a separate fcntl(2) F_SETFD operation to set the
FD_CLOEXEC flag does not suffice to avoid race conditions where one thread opens a file descriptor and attempts to set its close-on-exec
flag using fcntl(2) at the same time as another thread does a fork(2) plus execve(2). Depending on the order of execution, the race may
lead to the file descriptor returned by open() being unintentionally leaked to the program executed by the child process created by fork(2).
(This kind of race is in principle possible for any system call that creates a file descriptor whose close-on-exec flag should be set, and
various other Linux system calls provide an equivalent of the O_CLOEXEC flag to deal with this problem.)
https://www.cnblogs.com/zhangxuan/p/6297617.html
man fcntl:
FD_CLOEXEC:
The following commands manipulate the flags associated with a file descriptor. Currently, only one such flag is defined: FD_CLOEXEC, the close-on-
exec flag. If the FD_CLOEXEC bit is 0, the file descriptor will remain open across an execve(2), otherwise it will be closed.
F_GETFD (void)
Read the file descriptor flags; arg is ignored.
F_SETFD (int)
Set the file descriptor flags to the value specified by arg.
In multithreaded programs, using fcntl() F_SETFD to set the close-on-exec flag at the same time as another thread performs a fork(2) plus execve(2)
is vulnerable to a race condition that may unintentionally leak the file descriptor to the program executed in the child process. See the discus‐
sion of the O_CLOEXEC flag in open(2) for details and a remedy to the problem.
在线程中fork?
多线程语义下的fork
man 3 pthread_atfork
https://www.cnblogs.com/liyuan989/p/4279210.html
https://blog.codingnow.com/2011/01/fork_multi_thread.html
本文深入解析了O_CLOEXEC与FD_CLOEXEC标志在Linux系统调用中的作用,尤其是在多线程环境下避免文件描述符泄露到子进程的问题。详细讨论了在open()与fcntl()中使用这些标志的重要性,以及如何防止竞态条件。
1274

被折叠的 条评论
为什么被折叠?



