質問

次のようなプログラムをどのように実装できるか疑問に思っています tail -f C/C++ では、ログ ファイルに追加された新しい行を監視して処理するプログラム?

役に立ちましたか?

解決

fseek() を使用すると、ストリームの eof 条件をクリアできます。基本的に、ファイルの最後まで読み取り、しばらくスリープし、fseek() (位置を変更せずに) eof をクリアし、再度ファイルの最後まで読み取ります。洗う、すすぐ、を繰り返します。詳細については man fseek(3) を参照してください。

Perl では次のようになります。Perl の Seek() は本質的に fseek(3) のラッパーであるため、ロジックは同じです。

wembley 0 /home/jj33/swap >#> cat p
my $f = shift;
open(I, "<$f") || die "Couldn't open $f: $!\n";

while (1) {
  seek(I, 0, 1);
  while (defined(my $l = <I>)) {
    print "Got: $l";
  }
  print "Hit EOF, sleeping\n";
  sleep(10);
}
wembley 0 /home/jj33/swap >#> cat tfile
This is
some
text
in
a file
wembley 0 /home/jj33/swap >#> perl p tfile
Got: This is
Got: some
Got: text
Got: in
Got: a file
Hit EOF, sleeping

次に、別のセッションで次のようにします。

wembley 0 /home/jj33/swap > echo "another line of text" >> tfile

そして、元のプログラム出力に戻ります。

Hit EOF, sleeping
Got: another line of text
Hit EOF, sleeping

他のヒント

あなたが探しているのは、C/C++ の select() 呼び出しだと思います。man ページのコピーをここで見つけました。 http://www.opengroup.org/onlinepubs/007908775/xsh/select.html. 。Select はファイル記述子を引数として受け取り、そのうちの 1 つが変更され、読み取りの準備ができたときにそれを通知します。

tail プログラムはオープンソースなので、それを参照できます。私も同じことを疑問に思い、少し前にコードを見て、かなり単純だろうと思っていましたが、あまりにも複雑だったので驚きました。考慮しなければならない問題がたくさんあります。

ここを参照

tail を呼び出してストリームを取得してアプリに戻すことも、オープンソースなので独自のコードに取り込んでみることもできます。

また、C++ iostream では、表示専用のファイルを開き、最後の 10 ~ 20 行をバッファリングしながら最後まで読み取って出力することもできます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top