1

結果をファイルに書き込むプログラムがあり、そのファイルからリアルタイムで読み取りたいと考えています。これは通常のテキスト ファイルであり、外部プログラムは常に行全体を書き込みます。Linuxシステムでのみ実行する必要があります。

int last_read = 0;
int res;
FILE *file;
char *buf;
char *end = buf + MAXLINE - 1;
int c;
int fileSize;
char *dst;
while (external_programme_is_running()) {
   file = fopen(logfile, "r"); //without opening and closing it's not working
   fseek(file, 0, SEEK_END);
   fileSize = ftell(file);
   if (fileSize > last_read) {
      fseek(file, last_read, SEEK_SET);
      while (!feof(file)) {
        dst = buf;
        while ((c = fgetc(file)) != EOF && c != '\n' && dst < end)
            *dst++ = c;
        *dst = '\0';
        res = ((c == EOF && dst == buf) ? EOF : dst - buf);

         if (res != -1) {
            last_read = ftell(file);
            parse_result(buf)
         }
      }
  }
  fclose(file);
}

これは正しいアプローチですか?それとも、更新時刻を確認してからファイルを開いた方がよいでしょうか。ファイルが同時に変更された場合、読み取りがクラッシュする可能性はありますか?

4

3 に答える 3

4

ループの反復ごとにクローズ、再オープン、および再シークする必要がないようにするには、clearerrEOF を読み取った後にストリームを呼び出します。

于 2012-08-30T23:54:47.133 に答える
1

他のプログラムが書き込んでいるのと同時に読み込んでも問題はないはずです。起こりうる最悪の事態は、次にファイルを開くまで何が書き込まれたかを確認できないことです。

また、最後のシーク位置をファイルの最後と比較するアプローチは、ファイルへの追加を探す良い方法です。外部プログラムは単に追加の行を書き込んでいるためです。ただし、ループの最後に sleep(1) を追加することをお勧めします。これにより、大量の CPU を使用しなくなります。

于 2012-08-30T23:09:33.803 に答える
0

別のプロセスがファイルに書き込んでいる間にファイルを読み込んでも問題ありません。標準tail -fユーティリティは、まさにその目的のためによく使用されます。

唯一の注意点は、書き込みプロセスがファイルを排他的にロックしてはならないということです。

読み取りコード (つまり、 を使用fgetc()) については、書き込みプロセスは一度に 1 行ずつ書き込むとおっしゃっていたので、fgets()代わりに を参照することをお勧めします。

于 2012-08-30T23:39:26.333 に答える