#!/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"), }