理解C中read()和lseek()的功能

时间:2017-04-03 13:55:28

标签: c linux

当我们使用系统调用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()文件描述符,它完美地工作但我想知道并理解一些替代方案而不关闭文件描述符)

1 个答案:

答案 0 :(得分:0)

有些编辑制作了他们编辑的文件的副本,最后他们将其移动到原始文件名(可能将原始文件重命名为其他文件),因此您正在阅读的文件实际上与编辑器编辑的文件不同。这取决于您使用哪个编辑器来修改文件,这是一个复杂的任务,因为您可以有多个指向该文件的链接,因此预期编辑器不会执行此操作。确保您正在修改原始文件。有用的是拥有不同的内容文件并执行(而不是编辑文件)

$ your_program your_file.txt &
$ cat modified_version.txt > your_file.txt

看看会发生什么。

您尚未公开用于编辑文件的编辑器。