基本上,我需要知道在使用accept4()时设置SOCK_CLOEXEC的目的是什么。 如何使用accept中返回的文件描述符检查此标志的功能。
accepted_fd = accept4(sd, (struct sockaddr *)& tcp_remote, &size, SOCK_CLOEXEC);
答案 0 :(得分:7)
SOCK_CLOEXEC
存在的原因是为了避免从accept
获取新套接字和之后设置FD_CLOEXEC
标记之间的竞争条件。
通常,如果您希望文件描述符为close-on-exec,则首先以某种方式获取文件描述符,然后调用fcntl(fd, F_SETFD, FD_CLOEXEC)
。但是在线程程序中,在获取该文件描述符(在本例中为accept
)和设置CLOEXEC标志之间存在竞争条件。因此,Linux最近改变了大多数(如果不是全部)返回新文件描述符的系统调用,也接受了一些标志,告诉内核在使文件描述符有效之前以原子方式设置close-on-exec标志。这样竞争条件就会结束。
如果你想知道为什么关闭exec存在,那是因为在某些情况下,尤其是当您从特权程序执行非特权程序时,您不希望某些文件描述符泄漏到该程序。