c++ - 使用与 O_CLOEXEC 相同的 accept4() 设置 SOCK_CLOEXEcflags的目的是什么

标签 c++ c linux sockets unix

基本上,我需要知道在使用 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/

相关文章:

c - "fork()"后printf异常

linux - 在 Linux 下,如何追踪预构建软件中的内存泄漏?

c++ - 使用 visual studio 2012 构建 OpenCV 2.49

c++ - 如何在 GCC 4.5 中使用 C++0x 原始字符串?

c - 初始化单值多维数组

c - 删除 C 程序中的条件以加快速度

linux - logrotate 没有运行 prerotate 脚本

c# - 浮点加法 : loss-of-precision issues

c++ - 如何使用 std::cin 清除 TTY 设置为原始模式的输入缓冲区?

python - 在Mac上编译Python 3扩展模块