2012-11-06 19 views
5

最近、私は楽しみのために学習パイプを取り上げました。私はいくつかの部分で立ち往生してきましたが、私は思っていましたが、プログラムに入力して同時にそのプログラムから出力する方法を理解することはできません。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は動作しません現時点ではあまりにもうまい。

答えて

7

私は問題がPerlの終わりではなくCの終わりにあると思います。 Cは標準出力がパイプに送られるのを見ているので、標準入力を調べる前に標準出力バッファをフラッシュすることを嫌がることはあまりありません。

すると、この問題を解決するには、あなただけの行を追加することができる必要があります:最初のprintf後とfgets

fflush(stdout); 

(免責事項:テスト済み)

+0

このような簡単な答えです。 printf文の後にfflushを追加する必要がありました。私が最後のメッセージを残しておけば、メッセージは決して印刷されません。速い答えに感謝します。 – ozdrgnaDiies

+0

@ozdrgnaDiies:ようこそ! – ruakh

関連する問題