2013/7/7 Cameron Simpson <c...@zip.com.au>:
> On 06Jul2013 14:43, Victor Stinner <victor.stin...@gmail.com> wrote:
> | 2013/7/6 Cameron Simpson <c...@zip.com.au>:
> | > Yes. Please forget I mentioned fork(); it is only relevant if you
> | > were offering some facility to undo the addition of cloexec to a
> | > Popen passed file descriptor. Which you are not.
> |
> | Oh... gotcha. I now understood your concern.
> |
> | There is a little "trick" here: at fork, file descriptors are
> | duplicated in the child process and almost all properties (open state,
> | flags, offset, etc.) are shared. There is one little exception: file
> | attributes are not shared, and there is only one file attribute:
> | O_CLOEXEC. Setting O_CLOEXEC in a child process does not affect the
> | flag in the parent process ;-) I will add a unit test to check this.
>
> That's news to me. Interesting.
>
> I can't find UNIX doco to support this, though I haven't finished
> looking. None of the POSIX, Linux or MacOSX fork() manual pages
> seem to describe this.
>
> Can you point me at doco for this? I thought file descriptors were
> a direct index into a per-process table of file handle structures,
> and did not think the latter got part copies, part shared over a
> fork.

Sorry, I found this fact my mistake, not in the doc :-) You can verify
this behaviour using the follownig script:
hg.python.org/peps/file/tip/pep-0466/test_cloexec.py

Output on Linux:

initial state: fd=3, cloexec=False
child process after fork, set cloexec: cloexec=True
child process after exec: fd=3, cloexec=<invalid file descriptor>
parent process after fork: cloexec=False
parent process after exec: fd=3, cloexec=False

"parent process after fork: cloexec=False" means that the flag was not
modified in the parent process.

> Also, is O_CLOEXEC really the only file attribute? So O_NONBLOCK
> is a flag and not an attribute (guessing the terminology distinguishes
> these)? Now you mention it, ISTR noticing that there were distinct
> ioctls to adjust flags and something else.

See the manual page:
http://linux.die.net/man/2/fcntl

There are "File descriptor flags " and "File status flags", it looks
like they are inherited/shared differently between the parent and the
child process.

> Your change says:
>
>   On Windows, the close-on-exec flag is ``HANDLE_FLAG_INHERIT``.
>
> I feel it would be clearer to say:
>
>   On Windows, the close-on-exec flag is the inverse of 
> ``HANDLE_FLAG_INHERIT``.

Ok, fixed in the PEP.

Victor
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to