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
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
@ozdrgnaDiies: Prego! – ruakh