基本上,我需要知道当用accept4()来设置SOCK_CLOEXEC的目的是什么。 我怎样才能检查这个标志的function与从accept返回的文件描述符。
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标志。 这样的竞争条件是封闭的。
如果你想知道为什么在exec上存在close,那是因为在某些情况下,尤其是当你从特权程序中执行非特权程序时,你不希望某些文件描述符泄漏到那个程序中。