2013-02-04 2 views
0

저는 C 언어를 처음 사용하고 있습니다. 한 프로그램의 출력을 처리하기 위해 다른 프로그램으로 보내는 방법을 알아 내려고하고 있습니다. ... 또는 PIPE.C - printf와 scanf를 사용하는 파이프. 일시 중지

예 : ./foo | ./boo

foo - 외부 소스에서 100ms마다 데이터를 읽고 stdout에 씁니다.

야유는 -, 표준 입력에서 데이터를 읽고 몇 가지 간단한 계산을 수행하고 표준 출력에 기록,

(나는 foo에 대한 액세스 권한이없는,하지만 float 값 새 행에 100ms마다 기록합니다.)

나는 그것이 그러나 백 개 항목의 각 한 쌍 후에 작업이

는 ...이 이초 일시 중지 ...

가 그래서 약 200 라인, 이초 일시 정지, 200 선 2 초 간격을 뱉어. 등등.

내가 알고 있어야하는 버퍼가 있습니까?

다음은 부 코드입니다.

#include <stdio.h> 
float input; 
float value; 

while (1) 
    { 
    input = scanf("%f", &value); 

    {do stuff here} 

    printf("result %f \n ", input); 
    fflush(stdout); 

    } 
    return 0; 
} 

편집 나는 foo는이 100ms의 지연에 대한 루프를 가지고, 문제를 발견했다. 부두에 이것을 배관 할 때 그것은 어떻게 든 그룹화하게되었다. 이 루프를 제거하면 문제가 해결되었습니다

+1

'printf'에 개행 문자가 없습니다. 이 경우'printf' 다음에'fflush (stdout)'을 호출해야합니다. –

+0

David 님, 개행 문자 & fflush로 코드를 업데이트했으며 여전히 동일한 결과를 얻고 있습니다. – Mwilliams03

+0

'\ n'을 인쇄하면 stdout을 플러시하지 않아도됩니다. –

답변

0

EDIT 문제가 발견되었습니다. foo는 100ms 지연에 대한 루프를 가졌습니다. 부두에 이것을 배관 할 때 그것은 어떻게 든 그룹화하게되었다. 이 루프를 제거하면 문제가 해결됨

이 루프가 제거되어 문제가 해결되었습니다.

int millis() 
{ 
    struct timeval tv; 
    gettimeofday(&tv, NULL); 
    return (tv.tv_sec) * 1000 + (tv.tv_usec)/1000; 
} 
start = millis() 
while(millis() - start < 20) 
{ 
    usleep(1000); 
}