in reply to Correct code crashes ActivePerl Interpreter

This is nothing to do with signals or signal handling; and it is a bug.

It appears to stem from the piped-open filehandle being cloned into the thread causing a conflict when the thread is joined.

A simple workaround is to start the thread before you do the piped open:

#! /usr/bin/perl -w use strict; use threads; my $break = 0; $SIG{INT} = sub { $break=1; }; sub calculation { local $SIG{INT} = 'IGNORE'; print("calculating something\n"); 5; } my $thread = async(\&calculation); # Starting a co-process to read from. my $procid = open( READ, '-|', 'perl -e "$|=1; $SIG{INT} = \'IGNORE\'; for ($i=0;$i<10;$i++) {pri +nt \"Line $i\n\"; sleep 1;}"' ); # Reading from co-process. until ($break) { my $line = <READ>; last unless defined $line; print $line; } if ($break) { kill('ABRT', $procid); } close(READ); print $thread->join() ."\n";

You should raise a perlbug against this. The following minimised code demonstrates the problem (5.10.1):

#! /usr/bin/perl -w use strict; use threads; sub calculation { print("calculating something\n"); 5; } # Starting a co-process to read from. my $procid = open( READ, '-|', 'perl -e "$|=1; for (1..10) {print \"Line $_\n\"; sleep 1;}"' ); ##switch the order of the previous and next lines and the crash does n +ot occur. my $thread = async(\&calculation); # Reading from co-process. until ( 0 ) { my $line = <READ>; last unless defined $line; print $line; } close(READ); print $thread->join() ."\n";

Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.