2012-11-06 15 views
5

Recentemente ho iniziato a imparare tubi per divertimento. Mi sono bloccato su alcune parti, ma ho capito che penso, ma non riesco a capire come ottenere input per inoltrare a un programma e produrre da quel programma allo stesso tempo.Ingresso e uscita simultanei in Perl

Attualmente ho questo script Perl che gestisce le tubazioni:

#!/usr/bin/perl 
use strict; 
use warnings; 
use threads; 
use FileHandle; 
use IPC::Open2; 

my $cv_program = "./test"; #test is the compiled C program below 
my $cv_message = ""; 
my $cv_currentkey = ""; 
my $pid = open2(*PIN, *POUT, $cv_program); 
my $thread_pipeout = threads->create('PIPEOUT', \&PIN); 

$thread_pipeout->detach(); 

while($cv_currentkey ne "\n") 
{ 
    $cv_currentkey = getc(STDIN); 
    $cv_message .= $cv_currentkey; 
} 
print POUT $cv_message; 

sub PIPEOUT 
{ 
    my $PIN = shift; 
    while(<PIN>) 
    { 
     print $_; 
    } 
} 

E poi ho questo programma C che ha appena uscite qualcosa, chiede una stringa, quindi stampe che stringa:

#include <stdio.h> 

int main(int argc, char const *argv[]) 
{ 
    char input[100] = {0}; 

    printf("This is a test.\n"); 
    fgets(input, 100, stdin); 
    printf("You entered %s\n", input); 
    return 0; 
} 

l'uscita dalla esecuzione dello script Perl è:

~/Programming/Perl Pipes$ ./pipe.pl 
Hello 
This is a test. 
You entered Hello 

Avviso blocca wh sta prendendo l'input e poi stampa tutto in un blocco dopo. Ne ho bisogno per stampare Questo è un test, quindi attendere input come farebbe il programma vero e proprio.

Inoltre, noterò che il motivo per cui utilizzo getc anziché STDIN nello script Perl è perché non sono riuscito a trovare un modo per far sì che STDIN non blocchi l'output da test.c, tuttavia getc non funziona troppo bene al momento

risposta

7

Penso che il problema sia principalmente sul lato C piuttosto che sul lato Perl. C vede che il suo output standard sta andando a pipe, quindi non è molto puntiglioso fare in modo che pulisca il suo buffer di output standard prima di interrogare input standard.

Per risolvere questo problema, si dovrebbe essere in grado di aggiungere solo questa linea:

fflush(stdout); 

dopo il primo printf e prima della fgets.

(Disclaimer: Non testato.)

+0

Una risposta così semplice e funziona. Ho dovuto aggiungere fflush dopo entrambe le dichiarazioni printf però. Se lascio perdere l'ultimo messaggio, il messaggio non viene mai stampato. Grazie per la risposta rapida. – ozdrgnaDiies

+0

@ozdrgnaDiies: Prego! – ruakh

Problemi correlati