[Tutor] "standard output: Broken pipe"
Eric Brunson
brunson at brunson.com
Mon Oct 22 23:41:05 CEST 2007
Martin Walsh wrote:
> Michael Langford wrote:
>
>> This signal is not something you care about. All SIGPIPE means is that
>> the source of the signal found itself writing to a pipe with no sender.
>> Your line "signal.signal(signal.SIGPIPE, signal.SIG_DFL)" means use the
>> default signal handler for SIGPIPE. While this works (as the default
>> signal handler is the ignore handler, you actually want to explicitly
>> use the IGN handler, which will just ignore the signal. To do this use
>> " signal.signal(signal.SIGPIPE, signal.SIG_IGN)"
>>
>
> I don't think this is quite right, but please correct me if I'm
> misinformed, or just plain wrong. :)
>
> Using "signal.signal(signal.SIGPIPE, signal.SIG_IGN)" (kernel 2.6.20,
> bash 3.2, python2.5)
I just noticed something, Martin. subprocess.call() on my machine is
calling the shell as /bin/sh, not /bin/bash. This changes the behavior
of bash, possibly causing it to print the message. (Anyone else think
that subprocess should honor the SHELL environment variable?)
I can't get any invocation of the commands to generate the error
message, only when it's called from python does the ouput get
generated. Quite interesting, I'd love to know the explanation for that.
Still poking at it, though.
> still produces a broken pipe with the following code:
>
> import signal
> import subprocess as sp
> signal.signal(signal.SIGPIPE, signal.SIG_IGN)
> sp.call("yes 'Spam' | head -n 10", shell=True)
>
> My understanding is that python is *already* overriding with a SIG_IGN
> for SIGPIPE, and child processes inherit, which explains the difference
> in behavior when running the command from a shell terminal (on my system
> at least) vs. a python subprocess object. This is referenced in the
> signal module docs (http://docs.python.org/lib/module-signal.html), and
> appears to be confirmed in the python2.5 source (pythonrun.c).
>
> Also, while it is unclear in the signal module docs (to me at least), my
> take on the use of SIG_DFL is to revert (if necessary) to the *system*
> default action for a signal, not the python default (which is SIG_IGN).
> Again, this is my interpretation based on a very minimal understanding
> -- please correct me if I'm wrong.
>
>
>> The reason you don't see the error on the shell is that the bash shell
>> does not print notifications of SIGPIPE when running interactively. If
>> you instead copied your snippit of scripting into a shell script then
>> called that with "bash foo.sh", you'd see the exact same broken pipe.
>>
>
> Ok, this isn't true on my system either -- I don't get a broken pipe
> from a bash script. So, perhaps this is due to the differences in our
> kernel or bash versions. The version of bash on my system (3.2) has a
> DONT_REPORT_SIGPIPE define that is honored in both interactive and
> non-interactive shells. Presumably, this is how the ubuntu binary was
> compiled.
>
>
>> Here is what all the signals available do:
>> http://www.delorie.com/gnu/docs/glibc/libc_471.html
>>
>>
>
> Excellent link, thanks! IMO, the signal manpage ('man signal') is also a
> good resource. On my system, it contains a table of default actions.
> Here's what it has to say about SIGPIPE:
>
> """
> Signal Value Action Comment
> -------------------------------------
> SIGPIPE 13 Term Broken pipe: write to pipe with no readers
> """
>
> and, the 'Term' action is defined as follows:
>
> """
> Term Default action is to terminate the process.
> """
>
> Thanks!
> Marty
> _______________________________________________
> Tutor maillist - Tutor at python.org
> http://mail.python.org/mailman/listinfo/tutor
>
More information about the Tutor
mailing list