Damian Keefe wrote:
Hi Folks

$DBI::VERSION = "1.609"
perl, v5.8.8 built for x86_64-linux-thread-multi
SHELL=/bin/tcsh

I'm not sure if this should be considered a bug in DBI or elsewhere, but it has unpleasant consequences. Somewhere in the bowels of DBI, SIGPIPE gets set to 'IGNORE'. It remains in this state after disconnect(). If you then launch a second script using backticks and this script contains a line like

my $first_line = `grep -v '#' $filename|head -n 1`; # to get the first non-comment line

the shell which is invoked inherits the SIGPIPE = 'IGNORE' state. This causes a
grep: writing output: Broken pipe
error as the grep tries to write to the head process which has exited.

It took me a while to work this out because of the way perl populates the %SIG hash. It appears it only populates it once from the system when it is first used in the script. If you run the script below with the first print statement commented out you get

connected to dk_funcgen_classify_59_MEF
SIGPIPE=IGNORE

If you uncomment the first print statement you get

SIGPIPE=UNDEF
connected to dk_funcgen_classify_59_MEF
SIGPIPE=UNDEF

However, behind the scenes, something has changed SIGPIPE to IGNORE and the %SIG hash has not been updated.

(my workaround is to explicitly reset SIGPIPE to 'DEFAULT' in the second script)

cheers

Damian


I suspect you'll find its your driver library that ignores SIGPIPE as AFAIK, DBI does not. Oracle's OCI library changes some signal dispositions for sure and sometimes SIGPIPE/SIGCHLD.

Martin

<snipped example code>

Reply via email to