2012-11-06 4 views
5

최근 재미있는 학습 파이프를 사용했습니다. 나는 몇 가지 부분에 집착했다. 그러나 나는 대부분 생각했다. 그러나 입력을 받아서 프로그램으로 보내고 동시에 그 프로그램에서 출력하는 방법을 알아낼 수는 없다.Perl에서의 동시 입력 및 출력

현재 내가 배관 핸들이 펄 스크립트가 있습니다

#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; 
} 
:

#!/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 프로그램이를, 그 문자열을 출력

펄 스크립트를 실행의 출력은 다음과 같습니다

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

공지 사항이 블록 ㅁ 입력을 취한 후 블록의 모든 내용을 인쇄합니다. 인쇄가 필요합니다. 테스트입니다. 실제 프로그램처럼 입력을 기다립니다.

또한 내가 Perl 스크립트에서 STDIN 대신에 getc를 사용하는 이유는 testc의 출력을 차단하지 않도록 STDIN을 찾을 수 없기 때문입니다.하지만 getc가 작동하지 않습니다. 그 순간에도 너무 좋아.

답변

7

나는 문제가 대부분 Perl 끝보다는 C 끝에 있다고 생각한다. C는 표준 출력이 파이프로가는 것을 확인하므로 표준 입력을 쿼리하기 전에 표준 출력 버퍼를 플러시하는지에 대해 매우 신경 쓰지 않습니다.

것은이 문제를 해결하려면, 당신은 단지이 줄을 추가 할 수 있어야한다 : 첫 번째 printf 후와 fgets 전에

fflush(stdout); 

.

(면책 조항 : 테스트하지 않음)

+0

이렇게 간단한 대답과 효과가 있습니다. printf 문 뒤에 fflush를 추가해야했습니다. 마지막 메시지를 남기면 메시지가 인쇄되지 않습니다. 빠른 답변 주셔서 감사합니다. – ozdrgnaDiies

+0

@ozdrgnaDiies : 환영합니다! – ruakh