像这样:
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...
尽管我已经阅读了man fcntl
,但我仍无法弄清楚它的作用。
Answers:
它为文件描述符设置了close-on-exec标志,当exec
-family函数中的任何一个成功执行时,这会导致文件描述符自动(原子地)关闭。
它还会测试返回值以查看操作是否失败,如果文件描述符有效,这将是无用的,因为在任何情况下都不会在有效文件描述符上使该操作失败。
open
不accept
,socket
,pipe
,等...
dup()
,dup2()
并且不受影响)。您可能必须具有带有额外的“模式”或“标志”参数的新功能,这大概就是为什么它没有发生的原因。如果可以在套接字上使用O_CLOEXEC,则可以假设accept()
将在该标志返回的描述符上对其进行克隆。但是socket()
和pipe()
更棘手。
dup
并dup2
受到影响。close-on-exec标志适用于文件描述符,不适用于打开的文件描述,因此不会在重复的文件描述符之间共享。那是一件非常好的事情。
dup3
,pipe2
,和accept4
。另外,socket
具有SOCK_CLOEXEC
可以与请求的套接字类型组合的标志。
它标记了文件描述符,以便close()
在进程或任何子进程fork()
调用exec*()
函数族之一时自动将其描述符化。这对于防止将文件描述符泄漏给例如运行的随机程序很有用system()
。
FILE *
与文件描述符关联的任何文件流()无关。FD_CLOEXEC的一种有效用法是在执行Shell进程时关闭父进程已打开的日志文件。请注意,POSIX 2008具有open(2)
O_CLOEXEC的选项-因此您可以在打开文件时设置此属性,一旦广泛使用该文件将非常有用。