tail -f
ログファイルに追加された新しい行を監視して処理するプログラムである C/C++と同様のプログラムをどのように実装できるのでしょうか?
4 に答える
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
tail を呼び出してストリームを取得してアプリに戻すか、オープン ソースであるため、独自のコードにプルしてみてください。
また、C++ iostream では、ファイルを表示専用で開き、最後の 10 ~ 20 行をバッファリングしながら最後まで読み取り、それを出力することもできます。
あなたが探しているのは、c/c++ での select() 呼び出しだと思います。ここで man ページのコピーを見つけました: http://www.opengroup.org/onlinepubs/007908775/xsh/select.html。Select はファイル記述子を引数として取り、そのうちの 1 つが変更され、読み取りの準備ができたときに通知します。
tail プログラムはオープン ソースなので、それを参照できます。私も同じことを疑問に思って、しばらく前にコードを見て、それはかなり単純だと思っていましたが、その複雑さに驚きました。考慮に入れなければならない落とし穴がたくさんあります。