#!/usr/bin/perl -w use strict; use IPC::Open3; { my %pidlist; sub my_open3 { my $pid=open3(@_); $pidlist{$pid}=1 if $pid; warn "my_open3: Started process $pid\n"; $pid; } sub my_killkids { my($signal) = shift; warn "my_killkids: Killing processes ",join(" ",keys %pidlist),"\n"; kill $signal, keys %pidlist; } sub my_chld { my $pid = wait; warn "my_chld: Child $pid finished.\n"; delete $pidlist{$pid}; } } $SIG{CHLD} = \&my_chld; my_open3(\*STDOUT,\*STDIN,\*STDOUT,"sleep 10"); my_open3(\*STDOUT,\*STDIN,\*STDOUT,"sleep 10"); my_open3(\*STDOUT,\*STDIN,\*STDOUT,"sleep 10"); my_killkids('INT'); sleep(1); sleep(1); sleep(1); my_killkids('KILL');