2008-08-22 17 views
3

tail -fと似たプログラムを、ログファイルに追加された新しい行を監視して処理するプログラムC/C++でどのように実装できますか?ログウォッチャーの実装

答えて

5

fseek()を使用すると、ストリームのeof条件をクリアできます。本質的には、ファイルの終わりまで読み込み、しばらく待ってから、fseek()(位置を変更することなく)でeofをクリアします。洗濯、すすぎ、繰り返し。詳細はman fseek(3)を参照してください。

ここは、perlのようです。 perlの年代は、(求める)は、本質的に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 
0

See here

あなたは尾を呼び出すと、アプリに戻ってストリームを取得し、またはそれはオープンソースだと、多分あなた自身のコードにそれを引っ張るために試みることができるのいずれか。

また、C++ iostreamでは、ファイルを開いて最後に読むだけで、最後の10〜20行をバッファリングして出力することができます。

0

あなたが探しているのは、c/C++のselect()呼び出しです。マニュアルページのコピーをここに見つけました:http://www.opengroup.org/onlinepubs/007908775/xsh/select.html。 Selectは、ファイルディスクリプタを引数としてとり、そのうちの1つが変更され、読み込みの準備ができたことを通知します。

0

テールプログラムはオープンソースなので、参考にすることができます。私は同じことを思って、しばらく前にコードを見て、それはかなりシンプルだと思っていましたが、私はどれほど複雑であるかに驚いていました。アカウントに入れなければならないことがたくさんあります。