On May 12, 11:21 pm, robertgordon...@yahoo.com (robert Key) wrote:
> Hi,
>   I want to capture UNBUFFERED output from a C programme and then
> control it depending on its output. Problem is nothing seems to
> unbufferd the output from the C programme. Only when the child has
> finished executing do I get all the output which is too late.
>
> The C programe is just like hello world in a loop of 20.
>
> Here is the code:
> #!/usr/bin/perl -w
> use IO::Handle;
> sub killGroup {
>         # kill process group except self
>         local $SIG{HUP} = 'IGNORE';
>         kill (HUP, -$$);
>         print "killed child exit status $?\n";
>
> }
>
> if ($pid = open(READER, "-|")) {
>         # parent process
>         print "parent: starting\n";
>         while (<READER>) {
>                 print "parent: $_";
>                 killGroup if /3/;
>         }
>         close (READER);} else {
>
>         # child process
>         die "cannot fork: $!" unless defined $pid;
>         $SIG{HUP} = sub {die "child: killed by parent\n"};
>
>         # try and un buffer output
>         STDOUT->autoflush(1);
>         print STDOUT "child: starting\n";
>
>         # start the C programme which has printf in a loop
>         exec("/home/robert/try8 2>&1");
>         exit 0;}
>
> I have tried all the recipes int the Perl cook book but none work.

Could you simplify the perl a bit and use Inline::C to get around
 the pipe buffering...?

example:

#!/usr/bin/perl
use strict;
use warnings;
use Inline C => 'DATA';
run_c();

__DATA__
__C__
#include <stdio.h>
void run_c() {
    int i;
    char s[20] = "hello from c";
    for (i = 0; i < 15; i++) {
       sleep(1);
       printf("%s %d\n", s, i);
    }
}

--
Charles DeRykus


--
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to