如何检查文件是否已通过其他进程更改?

时间:2010-12-27 14:27:46

标签: c++ perl file

我有两个进程(perl中的第一个源,c ++中的秒源),并且它们都使用相同的文件。其中一个逐行写入文件,另一个读取文件,如果新行添加到文件中。对于知道文件被修改的第二个过程,第一个进程刷新 - 在每个独立之后。但是第二个进程只检查修改时间以增加开始读取,但是在添加新行并刷新文件后实际不会改变其“最后修改时间”。所以还需要另一个办法来做到这一点。所以问题在于,如何检测新行是否附加到文件中,以开始处理?

这是来自此程序的源代码的片段:

1

open FILE, ">>", $file or die $!;
for($i = 0; $i <= $#ticks; ++$i)
{
  print FILE $ticks[$i]."\n";
  FILE->flush();
  sleep(10);
}
close FILE;

2

struct stat64 file_info;
if(fstat64(fileno(this->auto_file_ptr.get_file()), &file_info)!=0)
{
//throw error that file have been changed
}
data_file_new_modification_time = 1000LL * file_info.st_mtime;
if(this->data_file_last_modification_time!=data_file_new_modification_time)
{
//processs the file
}

3 个答案:

答案 0 :(得分:1)

使用IPC机制同步C ++和Perl应用程序。您可以使用信号量或互斥量来实现此目的。

答案 1 :(得分:1)

欢迎使用基于事件的编程。

雇用select - 您不想知道文件何时更改,但是当新数据可用时。这个系统调用就是这样。

请参阅implementation in File::Tail了解所有边缘情况的实际示例。将此下载到C应该很容易,或者libevselect后端一起使用。

答案 2 :(得分:0)

在刷新文件时,似乎stat64不会更改它的st_mtime成员。相反,st_size会发生变化。所以我可以使用st_size来检测文件是否已更改。