当我们使用系统调用open()然后执行I / O操作(尤其是read()和lseek())时,如果我们在程序运行时更改文件,内核缓冲区是否会更新?如果没有,那么如何强制将实时更新文件同步到内核缓冲区。
以下是一个例子:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
int fd=0;
char ch='\0';
fd=open("test.dat",O_RDONLY);
while(1)
{
while(read(fd,&ch,1)!=0)
{
printf("%c",ch);
}
printf("\n");
lseek(fd,0,SEEK_SET);
sleep(5);
}
close(fd);
return 0;
}
现在,我在“test.dat”中有一些数据(例如:'3 3 34')。我打开了一个这个文件并将其读取结束,然后再次寻求启动。同时,在某些编辑器中,我打开了这个“test.dat”文件并更新了它的内容并保存了它们。由于read()和lseek()是系统调用,如果内核/ OS缓冲区定期与硬盘中的文件同步,则它们应对应于更新文件中的更改。但事实并非如此。文件中的更改不会从read()反映出来,而是继续打印初始内容。对于写作,如果有像sync(),fsync()等解决方案。但是对于阅读我们有一些这样的功能吗?
(注意:这个问题的一个简单的解决方案是close()和open()文件描述符,它完美地工作但我想知道并理解一些替代方案而不关闭文件描述符)
答案 0 :(得分:0)
有些编辑制作了他们编辑的文件的副本,最后他们将其移动到原始文件名(可能将原始文件重命名为其他文件),因此您正在阅读的文件实际上与编辑器编辑的文件不同。这取决于您使用哪个编辑器来修改文件,这是一个复杂的任务,因为您可以有多个指向该文件的链接,因此预期编辑器不会执行此操作。确保您正在修改原始文件。有用的是拥有不同的内容文件并执行(而不是编辑文件)
$ your_program your_file.txt &
$ cat modified_version.txt > your_file.txt
看看会发生什么。
您尚未公开用于编辑文件的编辑器。