zoukankan      html  css  js  c++  java
  • Linux进程-打开的文件

    Linux内核13.14

    Unix编程3.10

    系统中每一个进程都有自己的一组打开的文件,像根文件系统、当前工作目录、安装点等。有三个数据结构将VFS(虚拟文件系统)层和系统的进程紧密联系在一起,分别是:file_struct、fs_struct、和namespace结构体。

    file_struct结构体由进程描述符(task_struct)中的files目录项指向。所有与单个进程相关的信息(如打开的文件及文件描述符)都包含在其中。

    struct file_struct{

      atomic_t  count;  /*结构的使用计数*/

      struct fdtable  *fdt;  /*指向其它fd表的指针*/

      struct fdtable  fdtab;  /*基fd表*/

      spinlock_t  file_lock;  /*单个文件的锁*/

      int  next_fd;  /*缓存下一个可用的fd*/

      struct  embeded_fd_set  close_on_exec_init;  /*exec()时关闭的文件描述符链表*/

      struct  embeded_fd_set  open_fds_init;  /*打开的文件描述符链表*/

      struct  file  *fd_array[NR_OPEN_DEFAULT];  /*缺省的文件对象数组*/

    };

    fd_array数组指针指向已打开的文件对象。NR_OPEN_DEFAULT等于BITS_PER_LONG,在64位机器体系结构中这个宏的值为64,所以该数组可以容纳64个文件对象。如果一个进程打开的文件对象超过64个,内核将分配一个新数组,并将fdt指针指向它。所以对适当数量的文件对象的访问会执行的很快,因为它是对静态数组的操作;如果一个进程打开的文件数量过多,那么内核就需要建立新数组。

    Unix中的文件共享:

    (1)每个进程在进程表中都有一个记录项(task_struct?),记录项中包含一张打开的文件描述符表(类似file_struct?),可将其视为一个矢量,每个描述符占用一项。与每个文件描述符相关联的是:

    a.文件描述符标志(close_on_exec);

    b.指向一个文件表项的指针;

    (2)内核为所有打开文件维持一张文件表。每个文件表包含:

    a.文件状态标志(读、写、添写、同步和非阻塞等);

    b.当前文件偏移量;

    c.指向该文件v节点表项的指针;

    (3)每个打开文件(或设备)都有一个v节点。v节点包含了文件类型和对此文件进行各种操作函数的指针。对于大多数文件,v节点还包含了该文件的i节点。

    以上描述符表的某一项和其指针指向内容类似于Linux的file结构体。(文件标识ID是在file结构体中)

    Linux中没有v节点,但有i节点。

    Linux:task_struct(files)->file_struct(fd_array)->file;

    每个进程有自己的文件表项(Linux的file结构体),所以每个进程都有它自己的对该文件的当前偏移量(file结构体成员-偏移量)。

    -在完成每个write后,在文件表项中的当前文件偏移量即增加所写入的字节数。如果这导致当前文件偏移量超出了当前文件长度,则将i节点表项中的当前文件长度设置为当前文件偏移量(也就是该文件加长了)。(所以write从某位置写时,是覆盖写?)

    -如果用O_APPEND标志打开一个文件,则相应标志也被设置到文件表想的文件状态标志中。每次对这种具有追加写标志的文件执行写操作时,文件表项中的当前文件偏移量首先会被设置为i节点表项中的文件长度。这就使得每次写入的数据都追加到文件的当前尾端处。

    -若一个文件用lseek定位到文件当前的尾端,则文件表项中的当前文件偏移量被设置为i节点表项中的当前文件长度。

    -lseek函数只修改文件表项中的当前文件偏移量,不进行任何I/O操作。

    unix的文件共享通过文件描述符项的指向文件表项的指针实现,如多个进程的描述符表项中各有一项指针指向同一个文件表项。

    Linux中:进程描述符(task_struct)指向file_struct,file_struct通过fd_array指向file结构体。file结构体是打开的文件,但不是唯一地对应磁盘上的数据,file结构体的f_dentry指针(f_path.dentry)指向struct_dentry结构体,目录项(struct_dentry)是唯一地对应磁盘数据。因此共享文件通过不同的file结构体指向同一个dentry结构体实现。

     进程间可以通过不同进程的file结构体指向同一个dentry实现文件共享;进程内可以使多个文件描述符指向同一个文件file,

  • 相关阅读:
    有赞移动Crash平台建设
    软件测试创新之路
    手把手教你用Python实现智能推荐算法
    接口测试--参数实现MD5加密签名规则
    重置一发LCT模板
    LOJ #2131. 「NOI2015」寿司晚宴
    LOJ #3119「CTS2019 | CTSC2019」随机立方体 (容斥)
    2019牛客暑期多校训练营(第九场)
    20190815模拟赛
    zhengrui集训笔记2
  • 原文地址:https://www.cnblogs.com/cjj-ggboy/p/12261388.html
Copyright © 2011-2022 走看看