2009-05-19 17 views
2

EDIT:最後に、私は使用しました。 stefanBが言うように、inotifyは使用するものです。私はinotifyを使って-fモード、inotailを実装したテールクローンを見つけました。Cの "tail -f"機能のカスタム実装

元の質問文:

私は次のようにPythonで、それを開発したプロトタイピングのためにCプロジェクトの「テール-f」ロジック、実装しようとしている:


    # A forever loop, each 5 seconds writes a line into file.txt 
    from time import * 

    while 1: 
     sleep(5) 
     file = open("file.txt", "a") 
     file.write("This is a test\n") 
     file.close() 

次のコードは、(上記のコードによって更新)はfile.txtのEOF


    # tail -f 
    from time import * 

    file = open("file.txt", "r") 
    file.seek(0, 2) 

    while 1: 
     line = file.readline() 
     if not line: 
      sleep(1) 
     else: 
      print line 

    file.close() 

すべてが正常に動作しますが、Cの実装が動作していないが、次の(無チェックインエラーコードはありません)。 stdio.h、string.hおよびunistd.hのインクルードは省略されています(カラー化によってヘッダーインクルードコードが隠されています)。


    #define LINE_LEN 256 

    int main(int argc, char **argv) 
    { 
     FILE *f; 
     char line[LINE_LEN]; 

     f = fopen("file.txt", "r"); 

     fseek(f, 0, SEEK_END); 

     while (1) 
     { 
      fgets(line, LINE_LEN, f); 

      if (strlen(line) == 0) 
      { 
       sleep(1); 
      } 
      else 
      { 
       printf("Readed: %s", line); 
      } 
     } 

     fclose(f); 

     return 0; 
    } 

いくつかのアイデア?

代わりに、提示された解決策であるpoll()を使用して実装することをお勧めしますか。

ありがとうございます。

答えて

3

EDITinotifyを使用する事であるように思えます。 2.6.13以降、Linuxカーネルに含まれるべきです。 An article from IBM developerworks about inotify

前の答え:

は、Linux File Alteration Monitor(Linuxカーネル2.4.xの中>)を見てください。これは、ファイルの変更をサブスクライブし、変更が発生したときにカーネルからコールバックを取得するフレームワークです。これはポーリングよりも優れているはずです。どのようにファイルを待っているセクションをチェックアウトし、ファイルの変更をポーリングする

Examplesを変更し、ファイルのポーリングはを変更します。

まだ試していません。

3

FILE *にエラーまたはeofが表示されると、内部状態が設定され、後続の呼び出しでエラーまたはeofが返され続けます。睡眠が戻った後にclearerr(f);に電話をかけてeof設定をクリアし、ファイルからさらにデータを読み取ろうとする必要があります。 tailman pageから

+0

私はそれを試しましたが、私は同じ動作を得ました。 ありがとう! –

2

ファイルの終わりに達したときに停止しないでくださいではなく、 入力に付加される 追加データを待つ-f。ファイルが置き換えられた場合(つまり、 のiノード番号が変更された場合)、tailは ファイルを開き、続行します。 ファイルが切り捨てられた場合、tailは の位置を先頭にリセットします。これにより、 テールがログを見るのに役立ちます ファイルが回転する可能性があります。 入力がパイプの場合、-f オプションは無視されますが、FIFOが の場合は無視されます。

だから、あなたは同じことを行うことができます:そのファイルの内容を表示し、ファイル

  • のinode番号を読み取るために使用stat()

    1. を。例:p = ftell(fd)
    2. stat()を再度使用して、iノードが変更されたかどうかを確認します。その場合は、位置pからのファイルの内容を表示以降
    3. 繰り返し
  • +0

    ニース!私はマニュアルページのセクションを無視しました。ありがとう! –