1

Pythonを使用して、次の方法でログファイルを監視するデーモンを持っています:

f = open(r'logfile.log', 'r')
while True:
    line = f.readline()
    if not line:
      time.sleep(1)
    else:
      # do something

問題は、「何かをする」部分が C で書かれていると、はるかに高速に実行されることです。そのため、C でも同じことを行いたいと考えています。ログ ファイルを追跡する同様のアプローチは、C でどのように記述されるでしょうか?

以下は、ファイル全体を取得し、各行で「何か」を実行します。代わりに、ログファイルに新しい行を追加して「何かをする」だけにしたいと思います:)

  FILE *fr;
  char line[100];
  fr = fopen ("logfile.log", "rt");
  while(fgets(line, 100, fr) != NULL){
      //do something
  }
  fclose(fr);

ありがとう!

4

3 に答える 3

1

次のコードを試すことができます。

#include <stdio.h>
int main()
{
     mkfifo("tmpFifo");
     if(fork()==0)//to avoid the main program getting stuck at system()..
     {
          system("tail -f logfile.txt > tmpFifo");
          exit(0);
     }
     int fd = open("tmpFifo", O_RDONLY);
     char buff[1000];//set some length depending on the maximum string that gets 
                     //appended...
     int n;
     while((n=read(fd, buff, 1000))>0)
     {
         //do something... where 'n' stores the number of chars read...
     }
     close(fd);
     rm("tmpFifo");
     return 0;
}

を使用するのではなくコードを書きたい場合はtail -fこれが役立つ場合があります。しかし、これが最も簡単な解決策だと思います。

于 2013-09-18T15:40:32.037 に答える
1

この関数を使用しfseekて、ファイル内の特定のオフセットにスキップできます。Python コードによって検出された新しい行をスキップしないようにするために、Python の部分はシーク オフセットを C コードに渡す必要があります。(これを行う最善の方法は、C コードの呼び出し方法によって異なります..)

long seek_offset = /* get offset from Python side */
fseek(fr, seek_offset, SEEK_SET);
于 2013-09-18T15:33:01.163 に答える
1

私は当初、次のように答えていselect()ました。これはおそらく、どの Unix/Linux システムでも標準的な方法です

私はselect()ソケットとパイプで使用し、より多くのデータが利用可能な場合にのみ返されると想定しましたが、これは表面的な直感かもしれませんが、実際にはそうではありません:は、後続の(または)がブロックされないselect()場合に返すように定義されています、これは別のことです。ゼロバイトを読み取ってブロックしない可能性があるためです。read()write()read()

通常のファイルはread()、ファイルの終わりであっても、常に使用可能です。を使用してログ ファイルを末尾にしようとするとselect()select()決してブロックされず、後続read()の は長さ 0 になります。要するに、あなたは忙しく待っていることになります。ソースをtail実装に合わせて読むか、周囲の議論を読むと、これが確認されます。

他の誰かが同じ間違いを犯した場合に備えて、ここに残しておくべきだと思いました.

于 2013-09-18T19:55:32.863 に答える