0

在我的机器上,我有一个应用程序每秒重新生成的文件——它每次都包含不同的数据,因为它基于一些实时数据。

我想要一份此文件的副本,其中包含原始文件 5 分钟前所包含的内容。这在某种程度上很容易实现吗?我很乐意使用一些 BASH 脚本魔法来做到这一点,但是向该原始应用程序(用 c++ 编写)添加一些明智的、内存高效的代码也会让我满意 :)

4

3 回答 3

2

您用标记了您的问题。此答案仅适用于 Linux。

您可以使用inotify-tools ( inotifywait manpage ) 或incron ( incrontab(5) manpage ) 来查看目录并在文件关闭时制作文件副本。

于 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 回答