#define CHUNK 1024 /* read 1024 bytes at a time */
char buf[CHUNK];
FILE *file;
size_t nread;
file = fopen("test.txt", "r");
if (file) {
while ((nread = fread(buf, 1, sizeof buf, file)) > 0)
fwrite(buf, 1, nread, stdout);
if (ferror(file)) {
/* deal with error */
}
fclose(file);
}
- 注意:还有另外的文件读取方式:mmap
- struct file: 代表了打开的文件,有文件偏移,指向dentry, inode;lseek可以直接修改偏移。file由file descriptor指向。
- 目标就之一是task_struct->files对应的结构里会多出一个文件描述符,文件描述符指向一个文件表项(one entry in file table),文件表项指向vnode或inode,文件表项中含一个offset值,指向要操作的文件的偏移位置;另一个目标是从文件系统中读数据到进程的内存的。
- fread是libc的函数,带有buffer的读取函数,一般是基于系统调用read实现的。
- 使用open系统调用得到一个文件描述符。根据文件路径,加载vnode/inode, (Linux并没有vnode, 直接使用的inode)
- 使用read系统调用从磁盘读取数据到进程的内存空间。read系统调用会调用到vfs子系统的vfs_read, vfs_read,最终会调用到VFS中的file对象的f_op操作中的read方法(file->f_op->read)。VFS的设计是面向对象的,f_op根据具体的文件系统的不同,而有调用不同的实现。