http://qs321.pair.com?node_id=11107139


in reply to Interesting behaviour with signals and threads

Hi, shulam

Ah, the woes with signal handling :)

use 5.20.2; use warnings; use threads; use Time::HiRes qw/ time usleep /; $SIG{USR2} = 'IGNORE'; $SIG{TERM} = 'IGNORE'; my $pid; if (($pid = fork()) == 0) { sleep 1; my $ppid = getppid(); for (1 .. 1000) { usleep(int(rand(100000))); kill 'USR2', $ppid; kill 'TERM', $ppid; } } my $main_thr = threads->self(); $SIG{TERM} = sub { say "TERM"; }; $SIG{USR2} = sub { say "USR2"; }; my $thread = threads->create(sub { # Depending on implementation, the thread may receive the signal. # One way is to relay the signal to the intended recepient. $SIG{TERM} = $SIG{USR2} = sub { $main_thr->kill($_[0]); }; # Sleep stops early upon receiving a signal. my $start = time; do { usleep 1000; } until (time - $start >= 10.0); threads->exit(); }); # Wait for thread to finish. while ($thread->is_running()) { usleep 1000; } # Reap thread. $thread->join(); # Ditto, reap child. kill('KILL', $pid); waitpid($pid, 0);

Regards, Mario