我有一段非常简单的代码,它只是定期将少量数据写入文件。一旦我的程序创建了文件并附加了一些数据,当我在 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 }