文件描述符

一 :

文件描述符:是内核为了高效管理已被打开的文件所创建的索引,用于指向被打开的文件,所有的i/o操作的系统调用都会通过文件描述符

文件描述符是一个简单的非负整数,用来表明每一个被进程锁打开的文件,程序刚启动的时候,第一个打开的文件是0,第二个是1,如此类推

stdin–>0:输入设备

stdout–>1:输出设备

stderr–>2:错误

[root@master30 ~]# ls -l /proc/1216/fd
总用量 0
lrwx------ 1 root root 64 8月   7 08:30 0 -> /dev/pts/0
lrwx------ 1 root root 64 8月   7 08:30 1 -> /dev/pts/0
lrwx------ 1 root root 64 8月   7 08:29 2 -> /dev/pts/0
lrwx------ 1 root root 64 8月   7 08:30 4 -> /data/.a.txt.swp

注: 这些0,1,2,4就是文件的描述符。一个进程启动时,都会打开 3 个文件:标准输入、标准输出和标准出错处理

文件描述符(file descriptor)在Linux编程里随处可见,设备读写、网络通信、进程通信,fd可谓是关键中的关键。
深入理解可以增加我们使用它的信心。

该篇笔记主要解释了文件描述符底层的多态实现和文件描述符的生命周期。希望对自己和大家有所帮助。

先看三段简化后的内核代码

在这里插入图片描述
这三段代码分别是三个POSIX标准系统调用open,socket,pipe的内核态例程,
简化后的代码可以清楚看到,文件描述符的获取和安装在不同模块中都有着几乎相同的套路。

1 get_unused_fd顾名思义,它从当前进程描述符中的打开文件数组(current->files)里取得一个空闲的项,然后返回其数组下标。

2 filp_open最终将调用get_empty_filp,因此三段代码都使用get_empty_filp分配了一个新的文件对象(struct file)。

3 fd_install将上一个步骤创建的文件对象指针存到该进程的打开文件数组中。

至此,文件描述符安装完毕,返回的fd即为该文件对象在当前进程的task_struct中的files数组中的下标,也就是所谓的文件描述符,但究其本质,我们对文件描述符的所有使用其实就是在操作file对象。

接下来就是程序员最拿手的read,write,以及各种IO控制了。linux通过继承和多态实现方法的继承

二 :

操作系统利用文件描述符来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。

函数原型

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

参数含义:
pathname: 要打开或创建的目标文件
flags: 打开文件时,可以传入多个参数选项,下面的一个或者多个常量用 “|”连接构成flags
mode表示:设置文件访问权限的初始值,mode是在第二个参数是O_CREAT时才用作用

O_RDONLY: 只读打开
O_WRONLY: 只写打开
O_RDWR : 读,写打开
( 这三个常量,必须指定一个且只能指定一个)
O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
O_APPEND: 追加写

理解文件描述符:
当我们打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件(file结构体。表示一个已经打开的文件对象)而进程执行open系统调用,必须让进程和文件关联起来。每个进程都有一个指针 *files 保存在进程控制块PCB中 , 它指向一张表files_struct,该表包含一个指针数组,每个元素都是一个指向打开文件的指针。本质上,文件描述符就是该数组的下标。所以,只要获取到文件描述符,就可以找到对应的文件

在这里插入图片描述
在linux上,使用lsof 命令,可以查看到进程打开的文件,
在这里插入图片描述
0u,1u,2u对应输入,输出和错误
CHR-字符文件
0t0 - 偏移量

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值