I'm confused. Is my english so bad that no-one understands what I'm asking 
or is my understanding of SIGPIPE wrong?

> Can't you just close() the pipe?
Yes, of course. I wrote:

EF> Of course, when the tail exits, the head will get SIGPIPE as soon as it 
EF> tries to output something, but can the tail explicitly kill it earlier?
So yes, closing the tail of the pipe will deliver a SIGPIPE to the head,
but only as soon as it writes to the pipe, no? I was asking for a method 
to kill it even before it next tries to write something to the pipe.

I was asked about the context and what I was really trying to do.
I didn't give the context because I thaught it was irrelevant.
What I was really trying to do is partly trying to learn.

So the context is a collectd exec plugin translating envstat output to collectd 
PUTVALs. The structure is about

envstat -i 10 | while read ...
...
printf "PUTVAL ... || exit 1
...
done

Now the problem is that collectd sets a handler to ignore SIGPIPE, that's
inherited to the exec'd plugin (I could change that, after all, it's Open 
Source), so envstat continues to run.

After I realized what the problem was (SIGPIPE ignored), I thought what to do
and the obvious solution (apart from patching collectd) is to trap - PIPE 
before calling envstat. But since that would make envstat continue to run 
until it next tries to output something, I was asking myself whether there 
was a more elegant solution where I could explicitly kill envstat from within 
the while loop instead.
Of course, the question is not really relevant to envstat -i, but maybe 
I'll be facing a similar situation in the future where the head must be killed 
because no two incarnations may run at once or letting it continue is expensive 
or whatnot.

Reply via email to