我看到nginx源代码在系统支持时使用accept4
我在Linux 2.6.28之后提供了accept4
支持
accept4和accept之间有什么区别?
答案 0 :(得分:6)
accept4
是一个非标准的Linux扩展。
真正的区别在于flags
中不存在的第四个参数(accept
):
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
int accept4(int sockfd, struct sockaddr *addr,socklen_t *addrlen, int flags);
如果flags为0,则accept4()与accept()相同。下列 值可以在标志中按位OR运算以获得不同的行为:
SOCK_NONBLOCK Set the O_NONBLOCK file status flag on the new open file description. Using this flag saves extra calls to fcntl(2) to achieve the same result. SOCK_CLOEXEC Set the close-on-exec (FD_CLOEXEC) flag on the new file descriptor. See the description of the O_CLOEXEC flag in open(2) for reasons why this may be useful.
默认情况下,新文件描述符设置为在整个文件中保持打开状态 execve(2)(即,在中描述的FD_CLOEXEC文件描述符标志) fcntl(2)最初被禁用); O_CLOEXEC标志,如下所述, 可用于更改此默认值。
并且例如,通过使用此标志(SOCK_CLOEXEC
),可以避免多线程程序中的竞争条件,其中可能导致open()返回的文件描述符被无意泄漏到由子进程执行的程序fork(2)创建的进程。