zoukankan      html  css  js  c++  java
  • Linux系统编程5_文件描述符

    linux把一切都当作文件,包括设备;我们的显示器和键盘在linux系统来说都是文件;

    简单来理解:一个 Linux 进程可以打开成百上千个文件,为了表示和区分已经打开的文件,Linux 会给每个文件分配一个编号(一个 ID),这个编号就是一个整数,被称为文件描述符(File Descriptor)

    一个 Linux 进程启动后,会在内核空间中创建一个 PCB 控制块PCB 内部有一个文件描述符表(File descriptor table),记录着当前进程所有可用的文件描述符,也即当前进程所有打开的文件。

    除了文件描述符表,系统还需要维护另外两张表
      打开文件表(Open file table)
      i-node 表(i-node table)

    文件描述符表每个进程都有一个,打开文件表和 i-node 表整个系统只有一个。三者关系如下:

     文件描述符实际就是每个进程的文件描述符表的索引;通过索引(文件描述符)可以快速得到一个文件指针。

    这个文件指针实际上打开文件表的索引,通过打开文件表的索引(文件指针),可以得到文件的三个重要信息:

    • 文件偏移量,也就是文件内部指针偏移量。调用 read() 或者 write() 函数时,文件偏移量会自动更新,当然也可以使用 lseek() 直接修改。
    • 状态标志,比如只读模式、读写模式、追加模式、覆盖模式等。
    • i-node 表指针。

    真正要读写文件,还是得通过i-node表指针(i-node表的索引),也可以理解成inode号码。得到inode信息,这是文件的元信息:

    • 文件的字节数
    • 文件拥有者的User ID
    • 文件的Group ID
    • 文件的读、写、执行权限
    • 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
    • 链接数,即有多少文件名指向这个inode
    • 文件数据block的位置

    用户通过文件名,打开文件。
    实际上,系统内部这个过程分成三步:

    首先,系统找到这个文件名对应的inode号码;
    其次,通过inode号码,获取inode信息;
    最后,根据inode信息,找到文件数据所在的block,读出数据。

    另外对于文件描述符的理解:

    同一个进程的不同文件描述符可以指向同一个文件;
    不同进程可以拥有相同的文件描述符;
    不同进程的同一个文件描述符可以指向不同的文件(一般也是这样,除了 0、1、2 这三个特殊的文件);
    不同进程的不同文件描述符也可以指向同一个文件。

    接下来总结一下文件的类型

    普通文件类型:Linux中最多的一种文件类型, 包括 纯文本文件(ASCII);二进制文件(binary);数据格式的文件(data);各种压缩文件.第一个属性为 [-]
    目录文件:就是目录, 能用 # cd 命令进入的。第一个属性为 [d],例如 [drwxrwxrwx]
    块设备文件:就是存储数据以供系统存取的接口设备,简单而言就是硬盘。例如一号硬盘的代码是 /dev/hda1等文件。第一个属性为 [b]
    字符设备文件:即串行端口的接口设备,例如键盘、鼠标等等。第一个属性为 [c]
    套接字文件:这类文件通常用在网络数据连接。可以启动一个程序来监听客户端的要求,客户端就可以通过套接字来进行数据通信。第一个属性为 [s],最常在 /var/run目录中看到这种文件类型
    管道文件:FIFO也是一种特殊的文件类型,它主要的目的是,解决多个程序同时存取一个文件所造成的错误。FIFO是first-in-first-out(先进先出)的缩写。第一个属性为 [p]
    链接文件:类似Windows下面的快捷方式。第一个属性为 [l],例如 [lrwxrwxrwx]



     参考链接:

    Linux文件描述符到底是什么?:http://c.biancheng.net/view/3066.html

    linux文件描述符详解:https://www.cnblogs.com/alan666/p/8311890.html

    linux文件管理:https://blog.csdn.net/wwwlyj123321/article/details/100298377

    Linux系统中inode和block详解:https://www.cnblogs.com/yunxuanedu/p/13915421.html

  • 相关阅读:
    使用XmlDataDocument将数据存储到XML文档
    Dubbo+Nacos 运行异常io.netty.handler.codec.EncoderException: java.lang.NullPointerException
    一、字符串常量Java内部加载
    更高效率,Java快速获取图片尺寸宽高分辨率(支持webp)
    水印宽高比例自适应图片(Java-Thumbnails)
    UEditor 自定义图片视频尺寸校验
    应用宝官方错误日志
    Eclipse使用hibernate插件
    解决Eclipse建立Maven项目后无法建立src/main/java资源文件夹的办法
    [Err] 1022
  • 原文地址:https://www.cnblogs.com/grooovvve/p/14076856.html
Copyright © 2011-2022 走看看