accept4和accept之间有什么区别

时间:2014-05-30 10:50:01

标签: linux sockets nginx

我看到nginx源代码在系统支持时使用accept4 我在Linux 2.6.28之后提供了accept4支持 accept4和accept之间有什么区别?

1 个答案:

答案 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);

来自:accept man page

  

如果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.

来自:open man page

  

默认情况下,新文件描述符设置为在整个文件中保持打开状态          execve(2)(即,在中描述的FD_CLOEXEC文件描述符标志)          fcntl(2)最初被禁用); O_CLOEXEC标志,如下所述,          可用于更改此默认值。

并且例如,通过使用此标志(SOCK_CLOEXEC),可以避免多线程程序中的竞争条件,其中可能导致open()返回的文件描述符被无意泄漏到由子进程执行的程序fork(2)创建的进程。