I am reading the the Python documentation on the Popen class in the subprocess module section and I came across the following code:
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()
"The p1.stdout.close() call after starting the p2 is important in order for p1 to receive a SIGPIPE if p2 exits before p1.
SIGPIPE is a signal that would be sent if
dmesg tried to write to a closed pipe. Here,
dmesg ends up with two targets to write to, your Python process and the
subprocess clones file handles (using the
os.dup() function). Configuring
p2 to use
p1.stdout triggers a
os.dup() call that asks the OS to duplicate the pipe filehandle; the duplicate is used to connect
With two open file handles for
dmesg is never given a
SIGPIPE signal if only one of them closes early, so
grep closing would never be detected.
dmesg would needlessly continue to produce output.
So by closing
p1.stdout immediately, you ensure that the only remaining filehandle reading from
dmesg stdout is the
grep process, and if that process were to exit,
dmesg receives a