目录

前文

一,为什么有文件描述符

二,什么是文件描述符

2.1 文件操作接口

2.2 文件描述符

三,文件描述符的原理

四,文件描述符的分配规则


前文

本文主要是详解一下文件描述符,我们从1.为什么?2.是什么?3.实现原理三个方面来解释。

一,为什么有文件描述符

在语言和系统的学习中,IO流的学习是绕不开的,在其中我们会学到文件的打开,关闭,读取,写入等操作,而在这里面当文件被系统打开后,要怎么管理这些打开的文件呢?这时候就需要用到文件描述符来管理这些被打开的文件。

二,什么是文件描述符

2.1 文件操作接口

首先在C语言的库中有一系列的文件操作函数,如fopen(打开),fclose(关闭),fputs(写入),fgets(读取),众所周知语言层面的库是通过封装操作系统提供的接口来完成底层硬件的操作,而C语言的文件操作函数也不例外,其对应的底层接口分别是open(打开),close(关闭),write(写入),read(读取)

2.2 文件描述符

细心的同学一个已经放下,在上面的系统接口中,我用红线将变量fd标注出来,其实这就是文件描述符,在我们调用open打开文件或者新建文件后,系统会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。

文件描述符在形式上是一个非负整数。实际上,它是一个数组下标,指向系统为每一个进程所维护的该进程打开文件的文件描述符表。

接下来我们来写一个简单的代码来观察一下文件描述符:

这里我们发现我们只开了一个文件,但是文件操作符却是3,而不是0,1,2,这是为什么呢? 首先在Linux中我们要理解一切皆文件的第一要义,而从键盘输入,从显示器输出,其实也是打开对应的设备文件进行输入输出,即stdin,stdout,以及错误输出stderr,这三个分别称为标准输入,标准输出,标准错误,这三个默认的文件操作符分别是0,1,2。

三,文件描述符的原理

首先用户创建一个进程,我们创建一个进程结构task_struct来表示进程的属性,其中有一个File指针指向files_struct,其中存储这文件描述符表arr[],当我们打开文件时,会在内存中创建一个file_struct来存储每个打开文件的属性,然后这些file_struct按照文件描述符的规则再一一映射到文件描述符表arr[]中,因此当我们想修改或者读取log.txt文件时,就是通过log.txt的文件描述符在文件描述符表arr[]中找到其对应的file_struct结构体指针,然后对文件进行访问。

四,文件描述符的分配规则

规则:在file_struct中从小到大找到找到一个没有被使用的下标,作为新的文件描述符。

我们可以写一段代码来证明一下。

观察上图我们发现,当我们关闭0也就是stdin文件时,新开文件的文件描述符会从0下标开始

Linux——什么是文件描述符相关推荐

  1. Linux C:文件描述符、IO重定向、恢复标准输入输出

    目录 一.文件描述符 二.IO重定向 三.重定向回终端.伪终端 四.恢复标准输入输出 一.文件描述符 在Linux中,文件描述符是一个非负整数的数据类型.是FILE结构体中的一个成员属性. 每打开或者 ...

  2. linux文件描述符有什么用,linux上的文件描述符3有什么特别之处?

    我的工作,那将在Linux和Mac OS X上运行的服务器应用程序它是这样的:linux上的文件描述符3有什么特别之处? 启动主要应用 控制器进程的叉 调用lock_down()在控制过程中 再次叉终 ...

  3. Linux下利用文件描述符恢复的成功失败实验

    数据误删除是作为初级运维人员常常遇到的"低级错误",一些有经验的老手有时也在疲劳.不冷静的情况下"马失前蹄".一旦误删除数据文件,尽快采用影响最小.最迅速的手段 ...

  4. Linux中的文件描述符与打开文件之间的关系

    1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件.链接文件和设备文件.文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是 ...

  5. Linux中对文件描述符的操作(FD_ZERO、FD_SET、FD_CLR、FD_ISSET

    在Linux中,内核利用文件描述符(File Descriptor)即文件句柄,来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描述符.读写文件也需要使用文件描述符来指定 ...

  6. Linux网络编程--文件描述符

    文件描述符 在Unix和Unix-like操作系统中,文件描述符(file descriptor, FD)是一个文件或者像pipe或者network socket等之类的输入/输出源的唯一标识. 文件 ...

  7. linux exec操作文件描述符

    linux每一个打开文件都会关联一个文件描述符,需要的时候我们可以使用exec命令指定一个大于3的数字作为文件 linux默认文件描述符 每打开一个shell就会打开默认的三个文件描述符描0,1,2, ...

  8. Linux下的文件描述符

    引文 在 Linux 的世界里,一切设备皆文件.对文件的操作都是通过文件描述符(fd)来进行的. Linux 中有7种文件类型: 文件类型 文件类型描述 符号 普通文件 最常使用的一类文件,其特点是不 ...

  9. Linux最大打开文件描述符数

    1.    系统最大打开文件描述符数:/proc/sys/fs/file-max a.    查看 $ cat /proc/sys/fs/file-max 186405 2. 设置 a.    临时性 ...

最新文章

  1. [技术文档] 一劳永逸,用USB设备制作多系统引导
  2. 黑色诱惑 -- Media Player 11
  3. AttributeError: module ‘cv2‘ has no attribute ‘SIFT‘
  4. 从数据处理到人工智能的一批计算生态
  5. [詹兴致矩阵论习题参考解答]习题7.1
  6. Mac OS X snow leopard 10.6 VMware安装
  7. (Object-C)学习笔记(一)--开发环境配置和与c语言的区别
  8. SMTP 服务器要求安全连接或客户端未通过身份验证的各个解决方案(C#)
  9. 语义分割和实例分割_一文读懂语义分割与实例分割
  10. centos恢复图形界面_CentOS 7 启动与切换图形界面
  11. 全国交通智慧升级,阿里云视频上云打造高速公路“视觉中枢”
  12. 入门北京linux嵌入式培训行吗
  13. 编码解码 Base64 Base32 Base16
  14. 最新最全的云开发入门教程,微信小程序云开发,云函数,云数据库学习,微信小程序云开发扩展功能学习
  15. FlowNet 2.0的阅读笔记
  16. 一文曝光字节跳动薪资职级,资深开发的收入你意想不到~
  17. 常用计算机设备有哪几种,简述输入、输出设备功能,计算机中常用的输入、输出设备有哪几种?...
  18. Duke的咆哮语录②:我求求你们跟我学一下代码“分层”吧!
  19. db2 日期英式写法_英文日期写法 英文日期格式正确写法
  20. 【微信小程序】video视频(77/100)

热门文章

  1. mysql查询语句 变量_mysql查询语句中用户变量的使用
  2. [转]一个土木工程师的四川地震灾后思考(转自白板报http://www.baibanbao.net)
  3. 开展等级保护的目的是什么?
  4. 【仅供参考】csapp第八章课后习题答案(欢迎批评指正)
  5. JDBC中获取连接的几种方式,快来看看吧
  6. material theme 自定义_Material Theme
  7. Python爬虫理论Pro | (3) Requests库详解
  8. 个人计算机和手机软件的异同,在线考试手机端和电脑端有什么区别
  9. 24届近5年华南理工大学自动化考研院校分析
  10. android 桌面悬浮窗 录屏时间控制显示效果