0

私のマシンには、アプリケーションによって毎秒再生成されるファイルがあります。リアルタイムデータに基づいているため、毎回異なるデータが含まれています。

このファイルのコピーが欲しいのですが、これには5分前の元のファイルに含まれていたものが含まれています。これはどういうわけか簡単に達成できますか?BASHスクリプトの魔法を使ってこれを行うのはうれしいですが、元のアプリケーション(c ++で記述)に賢明でメモリ効率の高いコードを追加することも私を満足させます:)

4

3 に答える 3

2

質問にの両方のタグを付けました。この回答はLinuxにのみ適用されます。

inotify-toolsinotifywait manページ)またはincronincrontab(5) manページ)を使用して、ディレクトリを監視し、ファイルが閉じられたときにファイルのコピーを作成できる場合があります。

于 2012-06-15T01:56:53.493 に答える
1

ディスク容量が問題にならない場合は、同じファイルに書き込む代わりに、プログラムに毎秒新しいファイルを作成させることができます。合計300個のファイルが必要になります(5 min * 60 sec/min)。書き込むファイル名は次のようになります$somename + timestamp() % 300。このように、5分前にファイルを取得するには、ファイルにアクセスするだけです$somename + (timestamp()+1) % 300

于 2012-06-14T17:59:48.307 に答える
1

これを実現するには、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);
}
于 2012-06-14T19:39:39.017 に答える