0

我有一段非常简单的代码,它只是定期将少量数据写入文件。一旦我的程序创建了文件并附加了一些数据,当我在 vim(或任何其他编辑器)中打开这个文件并编辑它时,我的进程似乎无法再更新文件了。我没有看到系统调用返回任何错误。我尝试跟踪系统调用,即使文件没有被更新,也没有发现任何奇怪的东西。

由于每个进程都有自己的具有当前偏移量的文件表条目,我所期待的只是一个输出文件,其中的数据散布着来自两个非合作进程的写入(也可能是乱码)。但我观察到的是,一旦任何其他编辑器写入文件,我的程序就无法再更新文件。

其他一些有趣的观察

1)当我cat东西到输出文件时,我的程序可以继续更新没问题

2)当我自己的程序的多个实例写入同一个文件时,一切都很好

我知道有强制锁定以防止多次写入,但我试图了解下面发生的事情。对于某些记录器(如系统日志、apache 日志等),这种情况也表现正常

有什么想法可以解释这种行为吗?还有关于如何进一步调试的任何提示?

我的代码很简单:

  1 int main(int argc, char** argv)
  2 {
  3     const char* buf;
  4     if(argc < 2)
  5         buf = "test->";
  6     else
  7         buf = argv[1];
  8 
  9     int fd; 
 10     if((fd = open("test.log", O_CREAT|O_WRONLY|O_APPEND, 0644)) == -1) {
 11         perror("Cannot open test.log");
 12         exit(1);
 13     }   
 14 
 15     int num_bytes = strlen(buf), num_bytes_written = -1; 
 16 
 17     while(1) {
 18         if((num_bytes_written = write(fd, buf, num_bytes)) == -1) {
 19             perror("Could not write to fd");
 20         }   
 21         fsync(fd);
 22         sleep(5);
 23     }   
 24 }   
4

2 回答 2

1

当 vim(1) 编辑器退出时,它可能会用编辑后的版本替换原始文件。您的进程保持原始文件处于打开状态,但该文件不再存在,因为它的目录条目已被替换,因此,尚未打开文件的进程无法访问它。您的进程现在附加到任何其他进程都无法访问的文件。一旦您的进程关闭文件,它就会永远消失(除非您运行分区恢复程序)。

于 2010-10-17T16:19:28.747 回答
0

您的 vim 编辑器在您的文件的缓存版本上工作。当您的其他程序附加到原始文件时,它会修改此缓存。当您使用 vim 保存时,您会用更新的缓存文件覆盖原始文件并丢失所有日志。

于 2010-10-17T08:12:02.990 回答