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