Schrift
[thread]11751[/thread]

fork() unter mod_perl



<< >> 4 Einträge, 1 Seite
pq
 2008-05-05 17:36
#109211 #109211
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
ich habe ein kleines Problemchen mit Zombies.
wenn ich folgenden Code aus mod_perl heraus starte, bleibt immer ein Zombie übrig:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
local $SIG{CHLD} = "IGNORE";
if (my $pid = fork) {
}
else {
    print "child ($$)";
    # mach was aufwaendiges
    close STDOUT;
    close STDERR;
    close STDIN;
    CORE::exit;
}
# parent


wenn ich das ganze in der Kommandozeile starte, bleibt kein Zombie da, auch wenn
der parent-Prozess noch läuft.

Wenn ich allerdings das local() wegnehme, funktioniert es auch in mod_perl wie gewünscht.
Aber dadurch setze ich ja den Handler global und evtl. verlassen sich andere Funktionen
auf den default. Jemand eine Idee?
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
betterworld
 2008-05-05 20:51
#109222 #109222
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Ja, das CHLD kommt da wohl erst, wenn der Elternprozess schon wieder aus dem Block mit dem local herausgekommen ist.
Ein explizites waitpid wuerde helfen. Aber da man auf "was aufwaendiges" nicht warten will, muss man wohl ein Doppel-fork machen. Ungefaehr wie in spawn_async hier: Link
pq
 2008-05-05 21:06
#109223 #109223
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
@betterworld: ich dachte, man setzt $SIG{CHLD}, damit es beim fork beachtet wird.
wenn es erst dann beachtet wird, wennder prozess zurückkommt, ist ja ein local()
völlig sinnlos bei fork.
aber ich frage mich, wieso es dann in der kommandozeile klappt...
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
local $SIG{CHLD} = "IGNORE";
if (my $pid = fork) {
}
else {
print "child ($$)";
# mach was aufwaendiges
close STDOUT;
close STDERR;
close STDIN;sleep 3;
CORE::exit;
}
}
sleep 420;

der kindprozess ist hier auch erst fertig, wenn der äussere block schon verlassen ist.
trotzdem gibts keinen zombie.

edit: muss mich korrigieren, so kriegt man doch einen zombie. hab ihn wohl nicht entdeckt.
ok, dann ist es zumindest konsistent.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
betterworld
 2008-05-05 21:10
#109224 #109224
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
pq+2008-05-05 19:06:10--
@betterworld: ich dachte, man setzt $SIG{CHLD}, damit es beim fork beachtet wird.
wenn es erst dann beachtet wird, wennder prozess zurückkommt, ist ja ein local()
völlig sinnlose bei fork.

Ja, ist sinnlos ;)
Das SIGCHLD wird ja nicht an den Kindprozess gesendet sondern an den Elternprozess. Und eben erst dann, wenn der Kindprozess stirbt.
<< >> 4 Einträge, 1 Seite



View all threads created 2008-05-05 17:36.