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\"], s
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 grep
process.
That's because subprocess
clones file handles (using the os.dup2() function). Configuring p2
to use p1.stdout
triggers a os.dup2()
call that asks the OS to duplicate the pipe filehandle; the duplicate is used to connect dmesg
to grep
.
With two open file handles for dmesg
stdout, 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 SIGPIPE
.