Schrift
[thread]12501[/thread]

Skript nach Programmaufruf fortsetzen (Seite 2)

Leser: 2


<< |< 1 2 >| >> 13 Einträge, 2 Seiten
topeg
 2008-09-28 13:57
#114998 #114998
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Du musst im Elternprozess das Kind beenden,
oder im Kindprozess selber:

Mutter tötet kind:
(exec führt ein Programm mit der Pid des startenden aus)
Code (perl): (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
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/perl

use POSIX;
use warnings;
use strict;

my $file = "lines.txt";
open(LINES, "<$file");

my @ar_lines = <LINES>;
print $ar_lines[0]."\n";
foreach my $link (@ar_lines) {
  print $link."\n";
  my $pid = fork();

  if($pid == 0){
    # Child-Prozess     

    print "Ich bin das Kind:  ",$$,"\n";
    exec("/usr/bin/firefox ' $link'");
    exit(0);

  } else {
    # Parent-Prozess

    print "Ich bin der Vater: ",$$,"\n";
    print "Und mein Kind ist: ",$pid,"\n";

    # Etwas Ausgabe:
    for((reverse(1..35)){
      print "warte noch $_ Sekunden\n";
      sleep 1;
    }

    # Kind töten
    kill(15,$pid);
    waitpid($pid);

  }
  sleep(20);
}


oder Kind tötet sich selber:
Code (perl): (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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/perl

use POSIX;
use warnings;
use strict;

my $file = "lines.txt";
open(LINES, "<$file");

my @ar_lines = <LINES>;
print $ar_lines[0]."\n";
foreach my $link (@ar_lines) {
  print $link."\n";
  my $pid = fork();

  if($pid == 0){
    # Child-Prozess     
    print "Ich bin das Kind:  ",$$,"\n";

    $SIG{ALRM}=sub{ exit(0) };
    alarm(35);
    system("/usr/bin/firefox ' $link'");
    exit(0);

  } else {
    # Parent-Prozess
    print "Ich bin der Vater: ",$$,"\n";
    print "Und mein Kind ist: ",$pid,"\n";


    # Etwas Ausgabe...
    my $count=0;
    while(waitpid($pid,  WNOHANG)){
      sleep 1;
      $count++;
      print "warte schon $count Sekunden\n";

      # Kind abwürgen (9 = SIGKILL)
      if($count > 37 ){
        kill(9,$pid);
        print "Toete $pid\n";
      }
    }

  }
  sleep(20);
}


oder klassisch mit "eval":
Code (perl): (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
#!/usr/bin/perl

use POSIX;
use warnings;
use strict;

my $file = "lines.txt";
open(LINES, "<$file");

my @ar_lines = <LINES>;
print $ar_lines[0]."\n";
foreach my $link (@ar_lines) {
  print $link."\n";
  my $time=time();

  # eval führt den code "getrennt" aus
  # Signale etc. haben keine Wirkung
  # auf das Script drum herum
  eval {
    $SIG{ALRM}=sub{alarm(0); exit(0) };
    alarm(35);
    system("/usr/bin/firefox  '$link'");
    alarm(0);
  }

  print "Habe ".( time() - $time )." Sekunden gebraucht\n";
  sleep(20);
}


Aber die sind so ungetestet, es können noch Fehler drin sein.
IceRage
 2008-09-30 00:50
#115012 #115012
User since
2008-09-07
93 Artikel
BenutzerIn
[default_avatar]
Besten Dank, euch allen und natürlich Dank an topeg. Habs jetzt hinbekommen. Tut wie es soll ;-)

Gruß, IceRage
Gast Gast
 2008-09-30 02:02
#115015 #115015
und wie?
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2008-09-16 02:13.