【发布时间】:2014-04-13 19:40:26
【问题描述】:
基本上,我需要知道在使用accept4() 时设置SOCK_CLOEXEC 的目的是什么。 如何使用从接受返回的文件描述符检查此标志的功能。
accepted_fd = accept4(sd, (struct sockaddr *)& tcp_remote, &size, SOCK_CLOEXEC);
【问题讨论】:
基本上,我需要知道在使用accept4() 时设置SOCK_CLOEXEC 的目的是什么。 如何使用从接受返回的文件描述符检查此标志的功能。
accepted_fd = accept4(sd, (struct sockaddr *)& tcp_remote, &size, SOCK_CLOEXEC);
【问题讨论】:
SOCK_CLOEXEC 存在的原因是为了避免从accept 获取新套接字和之后设置FD_CLOEXEC 标志之间的竞争条件。
通常,如果您希望文件描述符在执行时关闭,您首先需要以某种方式获取文件描述符,然后调用fcntl(fd, F_SETFD, FD_CLOEXEC)。但是在线程程序中,在获取该文件描述符(在本例中来自accept)和设置 CLOEXEC 标志之间可能存在竞争条件。因此,Linux 最近更改了大多数(如果不是全部)返回新文件描述符的系统调用,以接受指示内核在使文件描述符有效之前自动设置 close-on-exec 标志的标志。这样竞争条件就结束了。
如果您想知道为什么存在 close on exec,那是因为在某些情况下,尤其是当您从特权程序执行非特权程序时,您不希望某些文件描述符泄漏到该程序。
【讨论】:
O_CLOEXEC,因为主要是出于特权升级/安全原因——如果发生非安全错误(通常是无限期阻塞)也非常非常普遍一个 FD 处于打开状态,超出了它的预期关闭时间,因为子进程仍然拥有它。