Thread system()-Aufruf in einem Kindprozess eines Servers (6 answers)
Opened by MickiM2000 at 2007-04-19 17:01

bloonix
 2007-04-20 14:08
#37512 #37512
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Nun, dann würde ich eher diese Variante bevorzugen:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
use strict;
use warnings;
use POSIX ":sys_wait_h";

$SIG{CHLD} = \&REAPER;

my @commands = qw/ls w id/;
my %childs   = ();
my %reaped   = ();

foreach my $cmd (@commands) {
  if (my $pid = fork) {
     $childs{$pid} = '';
  } else {
     # 1 sekunde warten, da es sein kann, dass $childs{$pid}
     # erst gesetzt wird, wenn der Child schon gestorben ist
     sleep 1;
     my $foo = qx{$cmd};
     exit($?/256);
  }
}

# solange schlafen, bis alle Childs eingesammelt wurden
sleep while scalar keys %childs;

print "child $_ terminated - status $reaped{$_}\n"
  foreach sort keys %reaped;

sub REAPER {
  my $sig = shift;
  my $pid;
  while (($pid = waitpid(-1, WNOHANG)) > 0) {
     delete $childs{$pid};
     $reaped{$pid} = $sig.':'.$?;
  }
  $SIG{CHLD} = \&REAPER;
}


#> ./test.pl
child 25145 terminated - status CHLD:0
child 25146 terminated - status CHLD:0
child 25147 terminated - status CHLD:0


Auf diese Weise handelt jeder Child den Systemcall selber und gibt den
Status über CHLD an den Parent zurück.\n\n

<!--EDIT|opi|1177063997-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.

View full thread system()-Aufruf in einem Kindprozess eines Servers