2009-05-14 3 views
2

fifo (명명 된 파이프)의 내용을 표준 출력으로 인쇄해야합니다.FIFO 내용을 출력하고 종료하십시오.

cat fifo 

문제는 cat는 반환하지 않는다는 것입니다 :
나는 명령을 사용할 수 있습니다. 그것은 실행중인 상태로 유지되고, FIFO에서 오는 많은 컨텐츠를 기다리고 있습니다. 그러나 잠시 동안 더 이상 내용이 올 수 없으므로 사용 가능한 것을 인쇄하고 싶습니다.

사용 가능한 콘텐츠를 인쇄하고 종료하는 명령이 있습니까 ??

EDIT 지금하고 다른 명령의 출력을 매를 작성하는 처리가
는 FIFO의 일단이다. 이 프로세스는 영구적으로 실행되므로 EOF가 없습니다.

답변

2

EOF를 보낼 수 없으면 '비 차단 고양이'를 사용할 수 있습니다. 나는 here (물론 크레디트는 원저자에게 간다)라는 C 테스트 버전을 포함시켰다. 마법은 다음과 같습니다. fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK).

이 비 차단 고양이의 첫 번째 인수는 다시 나가기 전에 대기 할 시간 (초)입니다.

#include <stdio.h> 
#include <fcntl.h> 
#include <time.h> 
#include <unistd.h> 
#include <string.h> 


void read_loop(int fFile, double wWait) 
{ 
    if (fFile < 0) return; 

    double max_time = wWait, total_time = 0; 
    struct timespec cycle_time = { 0, 50 * 1000 * 1000 }; 
    double add_time = (double) cycle_time.tv_sec + (double) cycle_time.tv_nsec/1000000000.; 

    char next_line[1024]; 

    FILE *input_file = fdopen(fFile, "r"); 

    while (total_time < max_time) 
    { 
    while (fgets(next_line, 1024, input_file)) 
    { 
    write(STDOUT_FILENO, next_line, strlen(next_line)); 
    total_time = 0; 
    } 

    nanosleep(&cycle_time, NULL); 
    total_time += add_time; 
    } 

    fclose(input_file); 
} 


int main(int argc, char *argv[]) 
{ 
    if (argc < 2) 
    { 
    fprintf(stderr, "%s [max time] (files...)\n", argv[0]); 
    return 1; 
    } 

    int max_wait = strtoul(argv[1],0, 10); 

    if (argc == 2) 
    { 
    fprintf(stderr, "%s: using standard input\n", argv[0]); 
    fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK); 
    read_loop(STDIN_FILENO, max_wait); 
    return 0; 
    } 

    int current = 2; 

    while (current < argc) 
    { 
    fprintf(stderr, "%s: switch to file '%s'\n", argv[0], argv[current]); 
    int next_file = open(argv[current++], O_RDONLY | O_NONBLOCK); 
    read_loop(next_file, max_wait); 
    close(next_file); 
    } 

    return 0; 
} 
+0

나는이 정도까지 올 것으로 기대하지 않았다. 나는 거기에 리눅스 명령이 내장되기를 바랬다. 어쨌든, 나는이 "비 블로킹 고양이"를 이미 사용하고 있습니다. 나는 그것을 조금 바꿨다. 나는 부동 소수점 연산을 좋아하지 않았고 그래서 그것을 정수 연산으로 바꾸었고 또한 시간 인수를 변경하여 밀리 초를 받아 들였다. 감사. – GetFree

0

FIFO의 다른 쪽 끝을 닫아야합니다. 그러면 EOF가 cat 프로세스로 전송됩니다.

+0

알고 있습니다.하지만 정확히 그 문제입니다. 다른 쪽 끝의 프로세스가 매번 데이터를 계속 전송할 것이므로 EOF가 절대 없을 것입니다. – GetFree