最近、私は楽しみのために学習パイプを取り上げました。私はいくつかの部分で立ち往生してきましたが、私は思っていましたが、プログラムに入力して同時にそのプログラムから出力する方法を理解することはできません。Perlでの同時入力と出力
現在、私は、配管を扱うこのPerlスクリプトがあります。
#!/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 $_;
}
}
をそして私はちょうど何かを出力し、このCのプログラムを持って、その文字列を出力し、その後、文字列を要求:
#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;
}
Perlスクリプトを実行した出力は次のとおりです。
~/Programming/Perl Pipes$ ./pipe.pl
Hello
This is a test.
You entered Hello
入力を受けてからブロック内のすべてを印刷します。私はそれを印刷する必要がありますこれはテストです、そして実際のプログラムのような入力を待ちます。
また、PerlスクリプトでSTDINではなくSTDINを使用する理由は、STDINがtest.cからの出力をブロックしないようにするための方法を見つけることができないためです。ただし、getcは動作しません現時点ではあまりにもうまい。
このような簡単な答えです。 printf文の後にfflushを追加する必要がありました。私が最後のメッセージを残しておけば、メッセージは決して印刷されません。速い答えに感謝します。 – ozdrgnaDiies
@ozdrgnaDiies:ようこそ! – ruakh