5

最近、私は楽しみのために学習パイプを取り上げました。私はいくつかの部分で立ち往生していますが、私はそれをほとんど理解していると思いますが、プログラムに転送するための入力とそのプログラムからの出力を同時に取得する方法を理解することはできません。

現在、配管を処理する次の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の代わりにgetcを使用する理由は、test.cからの出力をブロックしないようにSTDINを取得する方法が見つからなかったためですが、getcはどちらかの瞬間。

4

1 に答える 1

7

問題は主にPerl側ではなくC側にあると思います。Cは、標準出力がパイプに送られることを確認しているため、標準入力を照会する前に、標準出力バッファーを確実にフラッシュすることについてはそれほど慎重ではありません。

これを修正するには、次の行を追加するだけです。

fflush(stdout);

最初の後printfと前fgets

(免責事項:テストされていません。)

于 2012-11-06T20:47:30.803 に答える