Schöne Ostern schon mal,.. Ich würd gerne Perl-Childs (threads) einen "gracefull death" ermöglichen: Die liegen in einem längerem Schlaf und durch ein SIGINT, SIGTERM und so soll dieses sleep unterbrochen werden und die sollen dann halt 'was machen. Eigene Versuche schlugen alle fehl, die Kinder starben ohne Chance auf einen Seufzer. Nicht ein SIG ist dort angekommen - so war es ja auch hie und da zu lesenb, aber dann schrieb der Betreuer von cpan:threads, mit dem 'untigen' Programm kann man das machen! Sein Ausdruck: Starting threads... thr1 sleeping... thr2 sleeping... Waiting for termination signals: kill 21892 thr1 woke up thr2 woke up thr1 sleeping... thr2 sleeping... Caught SIGTERM Signalling thr1... Signalling thr2... Waking up threads using SIGUSR2... thr1 caught SIGUSR1 thr2 caught SIGUSR1 Ignoring SIGUSR2 thr1 woke up thr2 woke up thr1 done thr2 done Done Wenn ich das aber mit dem *selben* Code (copy,paste,save,chmod,run,..) mache, hab ich das 'was ich eh schon kenn: nix, kein Kinderseufzen: ~/Perl/Bash> ./testSig3.pl Starting threads... thr1 sleeping... thr2 sleeping... Waiting for termination signals: kill 10029 Caught SIGTERM Signalling thr1... Signalling thr2... Waking up threads using SIGUSR2... Ignoring SIGUSR2 Done ~/Perl/Bash> Als ich ihm das schreib, meinte er das sei wohl eine SuSE (9.3) Sache (Perl 5.8.6) Kann jemand versuchen *seine* Ergebnisse zu reproduzieren - würd schon gerne wissen, ob und wie's geht? Warum geht es bei mir - (bei SuSE??) nicht? Danke, Calli PS: nachzulesen unter: http://www.cpanforum.com/dist/threads ###### thread-prg ############ #!/usr/bin/perl use strict; use warnings; $| = 1; use threads; my ($thr1, $thr2, $term); # SIGUSR2 is used to wake up threads $SIG{USR2} = sub { print("Ignoring SIGUSR2\n"); }; $SIG{TERM} = sub { print("Caught SIGTERM\n"); # Send signals to threads print("Signalling thr1...\n"); $thr1->kill('USR1'); print("Signalling thr2...\n"); $thr2->kill('USR1'); print("Waking up threads using SIGUSR2...\n\n"); kill('USR2', $$); $term = 1; }; sub thr1 { my $term = 0; $SIG{USR1} = sub { print("\tthr1 caught SIGUSR1\n"); $term = 1; }; while (! $term) { print("\tthr1 sleeping...\n"); sleep 100; print("\tthr1 woke up\n"); } print("\tthr1 done\n"); } sub thr2 { my $term = 0; $SIG{USR1} = sub { print("\t\tthr2 caught SIGUSR1\n"); $term = 1; }; while (! $term) { print("\t\tthr2 sleeping...\n"); sleep 100; print("\t\tthr2 woke up\n"); } print("\t\tthr2 done\n"); } MAIN: { print("Starting threads...\n"); $thr1 = threads->create('thr1'); $thr2 = threads->create('thr2'); $thr1->detach(); $thr2->detach(); sleep(1); # Tell user what to do print("\nWaiting for termination signals: kill $$\n\n"); # Wait for termination signal while (! $term) { sleep(1); } # Give threads a chance to finish sleep(2); } print("\nDone\n"); exit(0); -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org