summaryrefslogtreecommitdiffstats
path: root/Doc/library/subprocess.rst
diff options
context:
space:
mode:
authorSegev Finer <segev208@gmail.com>2017-12-18 09:28:19 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2017-12-18 09:28:19 (GMT)
commitb2a6083eb0384f38839d3f1ed32262a3852026fa (patch)
treed95a4dd911ebc05549fe54dee0b76c67fe5c727a /Doc/library/subprocess.rst
parent87010e85cb37192d63b1a30e5fabba307ad5a3f5 (diff)
downloadcpython-b2a6083eb0384f38839d3f1ed32262a3852026fa.zip
cpython-b2a6083eb0384f38839d3f1ed32262a3852026fa.tar.gz
cpython-b2a6083eb0384f38839d3f1ed32262a3852026fa.tar.bz2
bpo-19764: Implemented support for subprocess.Popen(close_fds=True) on Windows (#1218)
Even though Python marks any handles it opens as non-inheritable there is still a race when using `subprocess.Popen` since creating a process with redirected stdio requires temporarily creating inheritable handles. By implementing support for `subprocess.Popen(close_fds=True)` we fix this race. In order to implement this we use PROC_THREAD_ATTRIBUTE_HANDLE_LIST which is available since Windows Vista. Which allows to pass an explicit list of handles to inherit when creating a process. This commit also adds `STARTUPINFO.lpAttributeList["handle_list"]` which can be used to control PROC_THREAD_ATTRIBUTE_HANDLE_LIST directly.
Diffstat (limited to 'Doc/library/subprocess.rst')
-rw-r--r--Doc/library/subprocess.rst42
1 files changed, 36 insertions, 6 deletions
diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst
index a2c184a..af96f41 100644
--- a/Doc/library/subprocess.rst
+++ b/Doc/library/subprocess.rst
@@ -452,17 +452,20 @@ functions.
common use of *preexec_fn* to call os.setsid() in the child.
If *close_fds* is true, all file descriptors except :const:`0`, :const:`1` and
- :const:`2` will be closed before the child process is executed. (POSIX only).
- The default varies by platform: Always true on POSIX. On Windows it is
- true when *stdin*/*stdout*/*stderr* are :const:`None`, false otherwise.
+ :const:`2` will be closed before the child process is executed.
On Windows, if *close_fds* is true then no handles will be inherited by the
- child process. Note that on Windows, you cannot set *close_fds* to true and
- also redirect the standard handles by setting *stdin*, *stdout* or *stderr*.
+ child process unless explicitly passed in the ``handle_list`` element of
+ :attr:`STARTUPINFO.lpAttributeList`, or by standard handle redirection.
.. versionchanged:: 3.2
The default for *close_fds* was changed from :const:`False` to
what is described above.
+ .. versionchanged:: 3.7
+ On Windows the default for *close_fds* was changed from :const:`False` to
+ :const:`True` when redirecting the standard handles. It's now possible to
+ set *close_fds* to :const:`True` when redirecting the standard handles.
+
*pass_fds* is an optional sequence of file descriptors to keep open
between the parent and child. Providing any *pass_fds* forces
*close_fds* to be :const:`True`. (POSIX only)
@@ -764,7 +767,7 @@ The :class:`STARTUPINFO` class and following constants are only available
on Windows.
.. class:: STARTUPINFO(*, dwFlags=0, hStdInput=None, hStdOutput=None, \
- hStdError=None, wShowWindow=0)
+ hStdError=None, wShowWindow=0, lpAttributeList=None)
Partial support of the Windows
`STARTUPINFO <https://msdn.microsoft.com/en-us/library/ms686331(v=vs.85).aspx>`__
@@ -814,6 +817,33 @@ on Windows.
:data:`SW_HIDE` is provided for this attribute. It is used when
:class:`Popen` is called with ``shell=True``.
+ .. attribute:: lpAttributeList
+
+ A dictionary of additional attributes for process creation as given in
+ ``STARTUPINFOEX``, see
+ `UpdateProcThreadAttribute <https://msdn.microsoft.com/en-us/library/windows/desktop/ms686880(v=vs.85).aspx>`__.
+
+ Supported attributes:
+
+ **handle_list**
+ Sequence of handles that will be inherited. *close_fds* must be true if
+ non-empty.
+
+ The handles must be temporarily made inheritable by
+ :func:`os.set_handle_inheritable` when passed to the :class:`Popen`
+ constructor, else :class:`OSError` will be raised with Windows error
+ ``ERROR_INVALID_PARAMETER`` (87).
+
+ .. warning::
+
+ In a multithreaded process, use caution to avoid leaking handles
+ that are marked inheritable when combining this feature with
+ concurrent calls to other process creation functions that inherit
+ all handles such as :func:`os.system`. This also applies to
+ standard handle redirection, which temporarily creates inheritable
+ handles.
+
+ .. versionadded:: 3.7
Windows Constants
^^^^^^^^^^^^^^^^^