Skip to content

Latest commit

 

History

History
32 lines (27 loc) · 1.72 KB

进程如何访问文件.md

File metadata and controls

32 lines (27 loc) · 1.72 KB

如下代码:

#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根据具体的文件系统的不同,而有调用不同的实现。

参考