Thread Wie breche ich ein Script ab, das andere Programme aufruft? (8 answers)
Opened by Sven_123 at 2010-06-15 13:45

pq
 2010-06-15 14:28
#138368 #138368
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
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.
Wiki: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: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem

View full thread Wie breche ich ein Script ab, das andere Programme aufruft?