在我的机器上,我有一个应用程序每秒重新生成的文件——它每次都包含不同的数据,因为它基于一些实时数据。
我想要一份此文件的副本,其中包含原始文件 5 分钟前所包含的内容。这在某种程度上很容易实现吗?我很乐意使用一些 BASH 脚本魔法来做到这一点,但是向该原始应用程序(用 c++ 编写)添加一些明智的、内存高效的代码也会让我满意 :)
您用linux和unix标记了您的问题。此答案仅适用于 Linux。
您可以使用inotify-tools ( inotifywait
man
page ) 或incron ( incrontab(5)
man
page ) 来查看目录并在文件关闭时制作文件副本。
如果磁盘空间不是问题,您可以让程序每秒创建一个新文件,而不是写入同一个文件。您总共需要 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);
}