使用与O_CLOEXEC相同的accept4()设置SOCK_CLOEXEC标志的目的是什么

时间:2014-03-10 15:40:28

标签: c++ c linux sockets unix

基本上,我需要知道在使用accept4()时设置SOCK_CLOEXEC的目的是什么。 如何使用accept中返回的文件描述符检查此标志的功能。

accepted_fd =   accept4(sd, (struct sockaddr *)& tcp_remote, &size,  SOCK_CLOEXEC);

1 个答案:

答案 0 :(得分:7)

SOCK_CLOEXEC存在的原因是为了避免从accept获取新套接字和之后设置FD_CLOEXEC标记之间的竞争条件。

通常,如果您希望文件描述符为close-on-exec,则首先以某种方式获取文件描述符,然后调用fcntl(fd, F_SETFD, FD_CLOEXEC)。但是在线程程序中,在获取该文件描述符(在本例中为accept)和设置CLOEXEC标志之间存在竞争条件。因此,Linux最近改变了大多数(如果不是全部)返回新文件描述符的系统调用,也接受了一些标志,告诉内核在使文件描述符有效之前以原子方式设置close-on-exec标志。这样竞争条件就会结束。

如果你想知道为什么关闭exec存在,那是因为在某些情况下,尤其是当您从特权程序执行非特权程序时,您不希望某些文件描述符泄漏到该程序。