Thread fork und growisofs
(12 answers)
Opened by cyborg0001 at 2011-03-31 10:30
Es ist hier günstig exec zu benutzen. Das startet das "ersetzt" das Script mit dem Programm. Die ProzessID bleibt gleich.
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: 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"), } |