基本上,我需要知道在使用 accept4() 时设置 SOCK_CLOEXEC 的目的是什么。 我如何使用从 accept 返回的文件描述符检查此标志的功能。
accepted_fd = accept4(sd, (struct sockaddr *)& tcp_remote, &size, SOCK_CLOEXEC);
最佳答案
SOCK_CLOEXEC
存在的原因是为了避免在从accept
获取新套接字和之后设置FD_CLOEXEC
标志之间出现竞争条件。
通常,如果您希望文件描述符在执行时关闭,您首先要以某种方式获取文件描述符,然后调用fcntl(fd, F_SETFD, FD_CLOEXEC)
。但在线程程序中,获取文件描述符(在本例中来自 accept
)和设置 CLOEXEcflags之间可能存在竞争条件。因此,Linux 最近更改了大多数(如果不是全部)返回新文件描述符的系统调用,以也接受标志,告诉内核在使文件描述符有效之前自动设置 close-on-exec 标志。这样竞争条件就关闭了。
如果您想知道为什么存在 close on exec,那是因为在某些情况下,尤其是当您从特权程序执行非特权程序时,您不希望某些文件描述符泄漏给该程序。
关于c++ - 使用与 O_CLOEXEC 相同的 accept4() 设置 SOCK_CLOEXEcflags的目的是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22304631/