summaryrefslogtreecommitdiff
path: root/Doc
diff options
context:
space:
mode:
authorGeoff Shannon <geoffpshannon@gmail.com>2019-05-21 02:36:58 -0700
committerVictor Stinner <vstinner@redhat.com>2019-05-21 11:36:57 +0200
commitcdb2dbfe92b95dcd19ccab1a1e9b8c39263c54b0 (patch)
tree3786ab2506e06181f718c84b7147d523f3c5ec38 /Doc
parent50b3f205d82d88eec69f18a0ad4bb2440ba73501 (diff)
downloadcpython-git-cdb2dbfe92b95dcd19ccab1a1e9b8c39263c54b0.tar.gz
[3.7] bpo-22865: Expand on documentation for the pty.spawn function (GH-11980) (GH-13455)
(cherry picked from commit 522ccef8690970fc4f78f51a3adb995f2547871a) Co-authored-by: Geoff Shannon <earthlingzephyr@gmail.com>
Diffstat (limited to 'Doc')
-rw-r--r--Doc/library/pty.rst29
1 files changed, 25 insertions, 4 deletions
diff --git a/Doc/library/pty.rst b/Doc/library/pty.rst
index 0ab766065d..12268437d0 100644
--- a/Doc/library/pty.rst
+++ b/Doc/library/pty.rst
@@ -43,11 +43,32 @@ The :mod:`pty` module defines the following functions:
Spawn a process, and connect its controlling terminal with the current
process's standard io. This is often used to baffle programs which insist on
- reading from the controlling terminal.
+ reading from the controlling terminal. It is expected that the process
+ spawned behind the pty will eventually terminate, and when it does *spawn*
+ will return.
+
+ The functions *master_read* and *stdin_read* are passed a file descriptor
+ which they should read from, and they should always return a byte string. In
+ order to force spawn to return before the child process exits an
+ :exc:`OSError` should be thrown.
+
+ The default implementation for both functions will read and return up to 1024
+ bytes each time the function is called. The *master_read* callback is passed
+ the pseudoterminal’s master file descriptor to read output from the child
+ process, and *stdin_read* is passed file descriptor 0, to read from the
+ parent process's standard input.
+
+ Returning an empty byte string from either callback is interpreted as an
+ end-of-file (EOF) condition, and that callback will not be called after
+ that. If *stdin_read* signals EOF the controlling terminal can no longer
+ communicate with the parent process OR the child process. Unless the child
+ process will quit without any input, *spawn* will then loop forever. If
+ *master_read* signals EOF the same behavior results (on linux at least).
+
+ If both callbacks signal EOF then *spawn* will probably never return, unless
+ *select* throws an error on your platform when passed three empty lists. This
+ is a bug, documented in `issue 26228 <https://bugs.python.org/issue26228>`_.
- The functions *master_read* and *stdin_read* should be functions which read from
- a file descriptor. The defaults try to read 1024 bytes each time they are
- called.
.. versionchanged:: 3.4
:func:`spawn` now returns the status value from :func:`os.waitpid`