FD_CLOEXEC fcntl()标志有什么作用?

com*_*fan 76 c

像这样:

if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...
Run Code Online (Sandbox Code Playgroud)

虽然我读过man fcntl,但我无法弄清楚它的作用.

R..*_*R.. 70

它为文件描述符设置close-on-exec标志,这导致文件描述符在任何exec-family函数成功时自动(并原子地)关闭.

它还测试返回值以查看操作是否失败,如果文件描述符有效则无用,因为在有效文件描述符上没有此操作失败的条件.

  • 请注意,它不会刷新与文件描述符关联的任何文件流(`FILE*`).FD_CLOEXEC的一个有效用途是关闭父进程在执行shell进程时打开的日志文件.请注意,对于O_CLOEXEC,POSIX 2008可以选择[`open(2)`](http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html) - 因此您可以在打开时设置此属性文件,一旦广泛可用,将非常有用. (3认同)
  • `dup`和`dup2`受到影响.close-on-exec标志适用于文件描述符,而不是打开的文件描述,因此不会在重复的文件描述符之间共享.这是一件非常好的事情. (2认同)
  • 跟进评论中的对话,POSIX已采用包含在下一期的新界面来解决这些不足:`dup3`,`pipe2`和`accept4`.此外,`socket`具有`SOCK_CLOEXEC`标志,您可以将其与请求的套接字类型结合使用. (2认同)

gee*_*aur 30

它标记文件描述符,以便close()在进程或其fork()调用exec*()函数系列之一的任何子进程时自动进行.这有助于防止文件描述符泄露到例如运行的随机程序system().