Thread fork und growisofs (12 answers)
Opened by cyborg0001 at 2011-03-31 10:30

topeg
 2011-04-02 04:24
#147301 #147301
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Es ist hier günstig exec zu benutzen. Das startet das "ersetzt" das Script mit dem Programm. Die ProzessID bleibt gleich.
more (5.0kb):
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
#!/usr/bin/perl
use strict;
use warnings;
use POSIX ":sys_wait_h";

my $tmpfile="iso.out";
my $device='/dev/cdrw0';
my $isofile='test.iso';

my $cmd=qq!growisofs -Z $device=$isofile >$tmpfile 2>&1!;

my $pid=fork();
die("ERROR FORK!")unless(definded($pid));

if($pid)
{
  while(1)
  {
    last if(waitpid($pid_c, WNOHANG));
    print "WARTE!\n";
    sleep(1);
  }

  print "EXIT\n";
}
else
{ exec($cmd); die("EXEC ERROR!"); }


Oder wenn du die Daten aus dem Programm lesen willst:

more (9.5kb):
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
48
49
50
51
52
53
54
55
56
#!/usr/bin/perl
use strict;
use warnings;
use IO::Select;
use POSIX ":sys_wait_h";

my $device='/dev/cdrw0';
my $isofile='test.iso';

my $cmd=qq! growisofs -Z $device=$isofile 2>&1!;

my $pid=open(my $ph, '-|', $cmd);

if($pid)
{
  #neuen Selektor erzeugen
  my $sel=IO::Select->new($ph);

  while(1)
  {
    # wenn daten im PIPE-Puffer sind
    while(defined($sel->can_read(0)))
    {
      my $line;
      # Es kann sein dass kein "\n" im Puffer ist
      # dann würde <$ph> auf ein "\n" warten.
      # darum das Lesen nach einer Sekunde abbrechen
      # man kann alternativ "read" dafür benutzen.
      # dann muss man aber selber nach dem "\n" im String suchen
      eval{
        local $SIG{ALRM}=sub{die()};
        alarm(1);
        $line=<$ph>;
        alarm(0);
      };

      # Zeile Ausgeben wenn eine gelesen wurde
      print "CHILD: $line" if($line);
    }

    # sonstiges zeug...
    print "DOING STUFF\n";
    select(undef,undef,undef,0.5);

    # Schleife verlassen wenn das Programm beendet wurde
    if(waitpid($pid, WNOHANG))
    {
      close($ph);
      last();
    }
  }

  print "EXIT\n";
}
else
{ die("ERROR START $cmd\n"), }

View full thread fork und growisofs