Hoi,
Ben nieuw hier, dus tis mn eerste post.
Maar ik heb sinds kort perl 5.8.0 draaien op mn freebsd 4.7 systemen en sindsdien heb ik erg vage problemen met signals en fork's.
Heeft er hier iemand perl 5.8.0 draaien?
Het volgende stukje is het probleem geisoleert:
Wat er met dit stukje gebeurt is het volgende:
Process wacht op connectie, en als het een connectie krijgt forked ie. de child wacht 5(6... ja) sec en gaat er gewoon uit.
De parent gaat na een 1 sec echter al weer terug naar $listen->accept() en wacht daar op een nieuwe verbinding. En nu komt ie: op het moment dat de _laatste_ child afsluit komt de parent uit $listen->accept() en doet een 'normale' exit. Niet de bedoeling dus...
Als ik de $SIG{CHLD} er uit haalt gebeurt dit niet. Als ik REAPER2 ipv REPEAR gebruik gebeurt het ook. En uiteraart wil ik wel een REAPER omdat de orphans de boel wel overlaten lopen anders...
Perl 5.005xxx en Perl 5.6.1 hebben hier beide totaal geen last van.
Ik vraag me dus ook af of er mogelijk iets mis is gegaan met de threads of signal libs van perl tijdens het compileren.
Grt Tijs
p.s. Ik kon geen perl forum vinden (!duits aub), dus post ik hem hier. als iemand er wel een weet -> graag....
Ben nieuw hier, dus tis mn eerste post.
Maar ik heb sinds kort perl 5.8.0 draaien op mn freebsd 4.7 systemen en sindsdien heb ik erg vage problemen met signals en fork's.
Heeft er hier iemand perl 5.8.0 draaien?
Het volgende stukje is het probleem geisoleert:
code:
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
38
39
40
41
42
43
44
45
46
47
48
49
| #!/usr/bin/perl
$|++;
use IO::Socket;
$listenport=50;
my $listen=IO::Socket::INET->new(LocalPort => $listenport,
Proto => "tcp",
Type => SOCK_STREAM,
Reuse => 1,
Listen => 0 ) or die "Could't set up server on port $listenport\n";
sub REAPER
{
$waitedpid = wait;
# loathe sysV: it makes us not only reinstate
# the handler, but place it after the wait
$SIG{CHLD} = \&REAPER;
}
sub REAPER2 {
1 until (-1 == waitpid(-1, WNOHANG));
$SIG{CHLD} = \&REAPER;
}; #End REAPER
$SIG{CHLD} = \&REAPER2;
while($conn=$listen->accept())
{
$pid=fork();
if($pid)
{
print "FORKED: Server goes on...pid: $pid\n";
print "M";
sleep(1);
next;
} else {
print "FORKED: Client goes on....pid: $pid\n";
$i=5;
while($i--)
{
print "C";
sleep(1);
};
close($conn);
sleep(1);
print "Exit";
exit(0);
};
}; |
Wat er met dit stukje gebeurt is het volgende:
Process wacht op connectie, en als het een connectie krijgt forked ie. de child wacht 5(6... ja) sec en gaat er gewoon uit.
De parent gaat na een 1 sec echter al weer terug naar $listen->accept() en wacht daar op een nieuwe verbinding. En nu komt ie: op het moment dat de _laatste_ child afsluit komt de parent uit $listen->accept() en doet een 'normale' exit. Niet de bedoeling dus...
Als ik de $SIG{CHLD} er uit haalt gebeurt dit niet. Als ik REAPER2 ipv REPEAR gebruik gebeurt het ook. En uiteraart wil ik wel een REAPER omdat de orphans de boel wel overlaten lopen anders...
Perl 5.005xxx en Perl 5.6.1 hebben hier beide totaal geen last van.
Ik vraag me dus ook af of er mogelijk iets mis is gegaan met de threads of signal libs van perl tijdens het compileren.
Grt Tijs
p.s. Ik kon geen perl forum vinden (!duits aub), dus post ik hem hier. als iemand er wel een weet -> graag....