gpt4 book ai didi

c - 截断文件影响读取过程

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:30 24 4
gpt4 key购买 nike

最近在看《UNIX系统编程》,正在做一些测试。我很困惑为什么我在终端中使用 truncate 命令截断文件,然后读取进程读取相同的位置 return 0 之前返回字符串“a”。进程打开文件,它会缓存文件,因为我改变了文件内容,然后读取,结果是一样的,没有改变,那么为什么truncate file会立即影响进程?在UNIX系统编程中,它说v节点包括当前文件大小?所以大小不会每次都从磁盘读取,它缓存在内存中。

读取过程代码源。

#include <unistd.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

int main(int argc, char *argv[])
{
int fd = open("a.txt", O_RDONLY);
char buf[1024];
int n;
for(int i = 0;i < 10; i++){
if (lseek(fd, 0, 0) == -1){
return 1;
}
n = read(fd, buf, 1);
if (n < 0){
perror("error");
return 1;
}
printf("%d\n", n);
buf[n]=0;
printf("buf %s\n", buf);
sleep(2);
}
return 0;
}

a.txt 只有一个字符:

a

最佳答案

缓存通常旨在提高性能,而不会产生任何其他可检测的影响。

如果 inode 被进程缓存,如您所描述的,那么另一个进程所做的修改可能对具有缓存信息的进程不可见。那会很糟糕。

实际上,磁盘 block 被缓存, inode 被缓存,各种其他结构可能被缓存,但在每种情况下,在内核中都有一个缓存,所有进程共享,因此它们都有一个一致的 View 。

当一个进程截断文件时,内存中的缓存会更新,存储新的文件大小(最终会写入磁盘,但可能不会立即写入)。当另一个进程再次调用 read 时,更新后的文件大小将从内存缓存中读取,而不是从磁盘中读取。

关于c - 截断文件影响读取过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47487867/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com