【发布时间】:2017-11-26 10:14:10
【问题描述】:
最近,我正在阅读 UNIX 系统编程,并进行了一些测试。 我很困惑为什么我在终端中使用 truncate 命令截断文件,然后读取过程读取相同的位置返回 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
【问题讨论】:
-
我认为您需要展示您正在使用的代码。如果您使用系统调用(
read()、write()、truncate()、open()等)而不是标准 I/O 库调用(fread()、getc()、fopen()等),您应该会看到由单独进程进行的截断立即生效。如果您的第一个程序(非截断程序)的读取位置为 1024 字节,但文件被截断,则下一次读取将返回 0(表示 EOF)。标准 I/O 库有缓冲;它可能不会立即发现截断。请创建一个 MCVE (minimal reproducible example) 来展示您的困惑。 -
StackOverflow 旨在帮助人们修复现有的编程代码。调试口头问题描述、教程、研究、工具、建议、库和代码的请求是题外话。 请阅读stackoverflow.com/help/on-topic、stackoverflow.com/help/how-to-ask、stackoverflow.com/help/dont-ask、stackoverflow.com/help/mcve,并在此处发布更多问题之前使用tour。祝你好运。
-
@Jonathan Leffler,shellter,对不起,我已经完成了代码,我很困惑为什么截断文件会立即影响读取过程?文件大小被缓存,它不会每次都立即从磁盘读取大小,为什么读取过程知道文件大小已更改?那么是内核通知打开文件的进程吗?
-
pluse-uno 用于包含一些代码,但您可能只需要接受“这就是它的工作方式”。在许多情况下,从另一个角度来看,这些问题可以解释为特征。 (严重地!) 。祝你好运!
-
@shellter,好的,非常感谢