[issue7523] add SOCK_NONBLOCK and SOCK_CLOEXEC to socket module
Antoine Pitrou
report at bugs.python.org
Tue Jan 12 19:05:52 CET 2010
Antoine Pitrou <pitrou at free.fr> added the comment:
Looking at it again, there's the question of accept() behaviour. In the original code, it will call internal_setblocking() on the new fd if the listening socket is non-blocking. In the new code, if SOCK_NONBLOCK is defined it will not call any OS function to set the new fd in non-blocking mode.
Here is what the man page has to say:
On Linux, the new socket returned by accept() does not inherit file status flags such as
O_NONBLOCK and O_ASYNC from the listening socket. This behavior differs from the canonical
BSD sockets implementation. Portable programs should not rely on inheritance or non-inher‐
itance of file status flags and always explicitly set all required flags on the socket
returned from accept().
Linux has defined accept4() precisely for this purpose:
If flags is 0, then accept4() is the same as accept(). The following values can be bitwise
ORed in flags to obtain different behavior:
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.
----------
_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue7523>
_______________________________________
More information about the Python-bugs-list
mailing list