私のマシンには、アプリケーションによって毎秒再生成されるファイルがあります。リアルタイムデータに基づいているため、毎回異なるデータが含まれています。
このファイルのコピーが欲しいのですが、これには5分前の元のファイルに含まれていたものが含まれています。これはどういうわけか簡単に達成できますか?BASHスクリプトの魔法を使ってこれを行うのはうれしいですが、元のアプリケーション(c ++で記述)に賢明でメモリ効率の高いコードを追加することも私を満足させます:)
質問にlinuxとunixの両方のタグを付けました。この回答はLinuxにのみ適用されます。
inotify-tools(inotifywait
man
ページ)またはincron(incrontab(5)
man
ページ)を使用して、ディレクトリを監視し、ファイルが閉じられたときにファイルのコピーを作成できる場合があります。
ディスク容量が問題にならない場合は、同じファイルに書き込む代わりに、プログラムに毎秒新しいファイルを作成させることができます。合計300個のファイルが必要になります(5 min * 60 sec/min)
。書き込むファイル名は次のようになります$somename + timestamp() % 300
。このように、5分前にファイルを取得するには、ファイルにアクセスするだけです$somename + (timestamp()+1) % 300
。
これを実現するには、300(5 * 60)ファイルのそれぞれを保持するためのスペースが必要です。ファイルのサイズが約50Kしかないことを示しているので、これは15MBのメモリで実行できます(ファイルシステムを乱雑にしたくない場合)
それは次のように単純でなければなりません:(のようなもの)
struct {char* buf; size_t size} hist[300]; //initalize to all nulls.
int n = 0;
struct stat st;
for(;;sleep(1)){
int ifd = open("file", O_READ);
int ofd = open("file-lag", O_WRITE);
stat(ifd, &st);
hist[n].size = st.st_size;
if(hist[n].buf)
free(hist[n].buf);
buffer[n] = malloc(hist[n].size);
read(ifd, hist.buf[n], hist[n].size);
n = (n+1)%300;
if(hist[n].buf)
write(ofd, hist.buf[n], hist[n].size)
close(ofd);
close(ifd);
}