summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlfred Perlstein <alfred@freebsd.org>2018-08-17 13:48:05 (GMT)
committerƁukasz Langa <lukasz@langa.pl>2018-08-17 13:48:05 (GMT)
commita2510732da4c75789cc1750a034bdc9d9fdffb5b (patch)
treec41378bffff0a9cf089b4164342818724446bc90
parent0e6e7a1e52a53090e33ebef13f8f1fbe9bec2375 (diff)
downloadcpython-a2510732da4c75789cc1750a034bdc9d9fdffb5b.zip
cpython-a2510732da4c75789cc1750a034bdc9d9fdffb5b.tar.gz
cpython-a2510732da4c75789cc1750a034bdc9d9fdffb5b.tar.bz2
Warn not to set SIGPIPE to SIG_DFL (#6773)
-rw-r--r--Doc/library/signal.rst34
1 files changed, 34 insertions, 0 deletions
diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst
index 67ee979..bf07559 100644
--- a/Doc/library/signal.rst
+++ b/Doc/library/signal.rst
@@ -503,3 +503,37 @@ be sent, and the handler raises an exception. ::
signal.alarm(0) # Disable the alarm
+Note on SIGPIPE
+---------------
+
+Piping output of your program to tools like :manpage:`head(1)` will
+cause a :const:`SIGPIPE` signal to be sent to your process when the receiver
+of its standard output closes early. This results in an exception
+like :code:`BrokenPipeError: [Errno 32] Broken pipe`. To handle this
+case, wrap your entry point to catch this exception as follows::
+
+ import os
+ import sys
+
+ def main():
+ try:
+ # simulate large output (your code replaces this loop)
+ for x in range(10000):
+ print("y")
+ # flush output here to force SIGPIPE to be triggered
+ # while inside this try block.
+ sys.stdout.flush()
+ except BrokenPipeError:
+ # Python flushes standard streams on exit; redirect remaining output
+ # to devnull to avoid another BrokenPipeError at shutdown
+ devnull = os.open(os.devnull, os.O_WRONLY)
+ os.dup2(devnull, sys.stdout.fileno())
+ sys.exit(1) # Python exits with error code 1 on EPIPE
+
+ if __name__ == '__main__':
+ main()
+
+Do not set :const:`SIGPIPE`'s disposition to :const:`SIG_DFL`
+in order to avoid :exc:`BrokenPipeError`. Doing that would cause
+your program to exit unexpectedly also whenever any socket connection
+is interrupted while your program is still writing to it.