Thread Wie breche ich ein Script ab, das andere Programme aufruft?
(8 answers)
Opened by Sven_123 at 2010-06-15 13:45
das problem ist, dass während system() SIGINT ignoriert wird.
ein fork-skelett sieht ungefähr so aus: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 if (my $pid = fork) { # im elternprozess, $pid ist die vom child } elsif (defined $pid) { # fork hat geklappt, bin im child # tu was exit; } else { die "Could not fork: $!"; } aber hast du schonmal unser wiki bemüht? da findet man öfter was, als man denkt. AllgemeinesFork sehr sinnvoll ist auch http://p3rl.org/perlipc so, und eine lösung könnte sein, dass du das fork machst, und wenn du dann ctrl-c drückst, bekommt der parent-prozess das signal. im parent killst du dann das child mit sigterm, weklches nicht ignoriert wird. etwa: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 my $pid =fork; $SIG{INT} = sub { # got ctrl-c, sending sigterm to child kill 15, $pid; exit; }; if ($pid) {#parent waitpid($pid,0); } elsif (defined $pid) { for (5 .. 10) { print "sleeping $_\n"; system("sleep $_"); } exit; } else { ... } edit: das mit dem unless finde ich ganz unsauber, du machst danach nichtmal ein exit im child. deshalb solltest du lieber erstmal sauberes forken lernen. Last edited: 2010-06-15 14:30:27 +0200 (CEST) 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: Wie frage ich & perlintro brian's Leitfaden für jedes Perl-Problem |