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

私はこの程度に来るとは思わなかった。私はそこにLinuxコマンドが組み込まれていることを期待していました。とにかく、私はすでにこの "吹き飛ばない猫"を使用しています。私はそれを少し変えました。私は浮動小数点演算を気に入らなかったので整数整数演算に変更し、時間引数をミリ秒受け入れに変更しました。ありがとう。 – GetFree

0

FIFOのもう一方の端を閉じる必要があります。それはcatプロセスにEOFを送信する必要があります。

+0

私は知っていますが、それはまさに問題です。もう一方のプロセスが1つずつデータを送信し続けるため、EOFは決してありません。 – GetFree

関連する問題