Thread fork problem: mal wieder.. (10 answers)
Opened by steinwolf at 2003-11-08 17:52

betterworld
 2003-11-09 03:01
#70648 #70648
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Wenn nicht wirklich viel Informationen rueber kommen sollen (wie es bei einer Fortschrittsanzeige der Fall ist), eignen sich eventuell auch Signale. Beispiel:
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
use strict;
use warnings;

# Hier wird definiert, was getan werden soll, wenn
# ein USR1-Signal kommt
$SIG{"USR1"} = sub { print "Wie die Zeit vergeht...\n"; };

# Hier wird definiert, was getan werden soll, wenn
# ein Kindprozess sich beendet (also wenn ein CHLD-Signal
# kommt)
$SIG{"CHLD"} = sub { print "Und vorbei!\n"; exit(0); };

my $parent_pid = $$;
defined(my $child_pid = fork()) or die "fork problem";

if(! $child_pid){
# Child
for(1..3){
kill "USR1", $parent_pid; # ein USR1-Signal schicken
sleep 1;
}
exit(0);
}

# Parent
# wir muessen dafuer sorgen, dass der Prozess am Leben bleibt.
# Sonst koennen wir nicht mehr auf die Signale reagieren.
sleep while 1;


P.S.: Hier muss man mit der Synchronisation aufpassen. Wenn man die fork-Anweisung und die beiden Zeilen, in denen die Signal-Handler vergeben werden, vertauscht, *kann* es passieren, dass das USR1-Signal verschickt wird, bevor der entsprechende Signalhandler aufgesetzt wurde. Das wird zur Folge haben, dass der Parent-Prozess fruehzeitig getoetet wird (Standardreaktion fuer USR1).\n\n

<!--EDIT|betterworld|1068342662-->

View full thread fork problem: mal wieder..