【发布时间】:2011-09-01 18:37:35
【问题描述】:
像这样:
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...
虽然我读过man fcntl,但我不知道它的作用。
【问题讨论】:
标签: c
像这样:
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...
虽然我读过man fcntl,但我不知道它的作用。
【问题讨论】:
标签: c
它为文件描述符设置 close-on-exec 标志,这会导致文件描述符在任何exec-family 函数成功时自动(并且原子地)关闭。
它还测试返回值以查看操作是否失败,如果文件描述符有效,这将毫无用处,因为在有效文件描述符上不存在该操作应该失败的条件。
【讨论】:
FILE *)。 FD_CLOEXEC 的一个有效用途是关闭父进程在执行 shell 进程时打开的日志文件。请注意,POSIX 2008 有一个用于 O_CLOEXEC 的 open(2) 选项 - 因此您可以在打开文件时设置此属性,一旦它被广泛使用,这将非常有用。
open 而不是 accept、socket、pipe 等...
dup() 和 dup2() 不受影响)。您可能必须拥有带有额外“模式”或“标志”参数的新功能,这可能是它没有发生的原因。如果您可以在套接字上使用 O_CLOEXEC,那么您可以假设accept() 会在它返回的描述符上克隆该标志。但是socket() 和pipe() 比较棘手。
dup 和 dup2 受到影响。 close-on-exec 标志适用于文件描述符,而不是打开的文件描述,因此它不会在重复的文件描述符之间共享。这是一件非常好的事情。
dup3、pipe2 和 accept4。此外,socket 具有 SOCK_CLOEXEC 标志,您可以将其与请求的套接字类型结合使用。
它标记文件描述符,以便当进程或其fork()s 的任何子进程调用exec*() 系列函数之一时,它将自动成为close()d。这对于防止将文件描述符泄漏到由例如运行的随机程序很有用。 system().
【讨论】: