Linux之从进程角度来理解文件描述符
文件描述符是一个非负整数,而内核需要通过这个文件描述符才可以访问文件。当我们在系统中打开已有的文件或新建文件时,内核每次都会给特定的进程返回一个文件描述符,当进程需要对文件进行读或写操作时,都要依赖这个文件描述符进行。
在Linux或类UNIX系统中内核默认会为每个进程创建三个标准的文件描述符,分别是0(标准输入)、1(标准输出)和2(标准错误)。
通过查看/proc/PID号/fd/目录下的文件,就可以查看每个进程拥有的所有文件描述符。
mango@mango-ubuntu:~/Documents/filedesc$ sudo ls -l /proc/$$/fd
total 0
lrwx------ 1 mango mango 64 5月 24 11:08 0 -> /dev/pts/1
lrwx------ 1 mango mango 64 5月 24 11:08 1 -> /dev/pts/1
lrwx------ 1 mango mango 64 5月 24 11:08 2 -> /dev/pts/1
lrwx------ 1 mango mango 64 5月 24 11:08 255 -> /dev/pts/1
当打开文件时系统内核就会为特定的进程自动创建对应的文件描述符。
首先在一个Terminal中使用vi打开temp文件;
mango@mango-ubuntu:~/Documents/filedesc$ vi temp
新打开一个Terminal并查看此进程的fd信息;
mango@mango-ubuntu:~/Documents/filedesc$ sudo ps -a | grep vi
8888 pts/1 00:00:00 vi
mango@mango-ubuntu:~/Documents/filedesc$ sudo ls -l /proc/8888/fd
total 0
lrwx------ 1 mango mango 64 5月 24 11:22 0 -> /dev/pts/1
lrwx------ 1 mango mango 64 5月 24 11:22 1 -> /dev/pts/1
lrwx------ 1 mango mango 64 5月 24 11:22 2 -> /dev/pts/1
lrwx------ 1 mango mango 64 5月 24 11:22 3 -> /home/mango/Documents/filedesc/.temp.swp
我们也可以手动定义文件描述符,并通过文件描述符操作文件;
创建文件描述符
exec文件描述符 <> 文件名
引用文件描述符
&文件描述符
关闭文件描述符
exec文件描述符<&-
exec文件描述符>&-
我们touch一个文件,并将其文件描述符设置为10,并通过这个文件描述符来操作文件;
mango@mango-ubuntu:~/Documents/filedesc$ touch testfile11
mango@mango-ubuntu:~/Documents/filedesc$ sudo ls -l /proc/$$/fd
total 0
lrwx------ 1 mango mango 64 5月 24 11:39 0 -> /dev/pts/2
lrwx------ 1 mango mango 64 5月 24 11:39 1 -> /dev/pts/2
lrwx------ 1 mango mango 64 5月 24 11:39 2 -> /dev/pts/2
lrwx------ 1 mango mango 64 5月 24 11:39 255 -> /dev/pts/2
mango@mango-ubuntu:~/Documents/filedesc$ exec 10>testfile11
mango@mango-ubuntu:~/Documents/filedesc$ echo hello >&10
mango@mango-ubuntu:~/Documents/filedesc$ echo "world">&10
mango@mango-ubuntu:~/Documents/filedesc$ cat testfile11
hello
world
mango@mango-ubuntu:~/Documents/filedesc$ exec 10<&-
mango@mango-ubuntu:~/Documents/filedesc$ echo "closed">&10
bash: 10: Bad file descriptor
如果我们设置文件描述符只允许读,那么我们写文件的时候就会报错;
mango@mango-ubuntu:~/Documents/filedesc$ exec 11<testfile11
mango@mango-ubuntu:~/Documents/filedesc$ cat <&11
hello
world
mango@mango-ubuntu:~/Documents/filedesc$ cat <&11
mango@mango-ubuntu:~/Documents/filedesc$ exec 11<testfile11
mango@mango-ubuntu:~/Documents/filedesc$ echo "world">&11
bash: echo: write error: Bad file descriptor
mango@mango-ubuntu:~/Documents/filedesc$ ls -l /proc/$$/fd
total 0
lrwx------ 1 mango mango 64 5月 24 11:39 0 -> /dev/pts/2
lrwx------ 1 mango mango 64 5月 24 11:39 1 -> /dev/pts/2
lr-x------ 1 mango mango 64 5月 24 11:52 11 -> /home/mango/Documents/filedesc/testfile11
lrwx------ 1 mango mango 64 5月 24 11:39 2 -> /dev/pts/2
lrwx------ 1 mango mango 64 5月 24 11:39 255 -> /dev/pts/2
mango@mango-ubuntu:~/Documents/filedesc$ exec 11<&-
mango@mango-ubuntu:~/Documents/filedesc$ ls -l /proc/$$/fd
total 0
lrwx------ 1 mango mango 64 5月 24 11:39 0 -> /dev/pts/2
lrwx------ 1 mango mango 64 5月 24 11:39 1 -> /dev/pts/2
lrwx------ 1 mango mango 64 5月 24 11:39 2 -> /dev/pts/2
lrwx------ 1 mango mango 64 5月 24 11:39 255 -> /dev/pts/2
我们也可以创建一个同时可读可写的文件描述符;
mango@mango-ubuntu:~/Documents/filedesc$ exec 11<>testfile11
mango@mango-ubuntu:~/Documents/filedesc$ cat <&11
hello
world
mango@mango-ubuntu:~/Documents/filedesc$ echo "read write" >&11
mango@mango-ubuntu:~/Documents/filedesc$ cat <&11
mango@mango-ubuntu:~/Documents/filedesc$ exec 11<>testfile11
mango@mango-ubuntu:~/Documents/filedesc$ cat <&11
hello
world
read write
mango@mango-ubuntu:~/Documents/filedesc$ exec 11<&-
mango@mango-ubuntu:~/Documents/filedesc$ cat <&11
bash: 11: Bad file descriptor
Linux之从进程角度来理解文件描述符的更多相关文章
- Linux的进程、线程、文件描述符是什么
说到进程,恐怕面试中最常见的问题就是线程和进程的关系了,那么先说一下答案:在 Linux 系统中,进程和线程几乎没有区别. Linux 中的进程就是一个数据结构,看明白就可以理解文件描述符.重定向.管 ...
- 自学Linux Shell14.2-在脚本中使用其他文件描述符
点击返回 自学Linux命令行与Shell脚本之路 14.2-在脚本中使用其他文件描述符 在脚本中重定向输入和输出,并布局限于以上讲的3个默认的文件描述符,shell最多可以有9个打开的文件描述符.这 ...
- Linux内核笔记--深入理解文件描述符
内核版本:linux-2.6.11 文件描述符(file descriptor)在Linux编程里随处可见,设备读写.网络通信.进程通信,fd可谓是关键中的关键. 深入理解可以增加我们使用它的信心. ...
- Linux 进程级开启最大文件描述符 调优
开启最大文件数 系统可以开启的最大文件描述符(可同时开启最多的文件数),最大开启65535,可根据需求进行调优. 查看系统当前可开启最大文件描述符数 ulimit -n [root@localhost ...
- Linux 进程间传递文件描述符
文章目录 文件描述符 文件数据结构 共享文件 UNIX域socket实现传递文件描述符 进程间传递打开的文件描述符,并不是传递文件描述符的值.先说一下文件描述符. 文件描述符 对内核来说,所有打开的文 ...
- Linux系统学习笔记:文件描述符标志
文件描述符标志的概念 文件描述符标志(目前就只有一个close-on-exec): 它仅仅是一个标志,当进程fork一个子进程的时候,在子进程中调用了exec函数时就用到了这个标志.意义是执行exec ...
- Linux文件描述符与打开文件之间的区别(转载)
转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为: ...
- linux文件描述符--转载
转自:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录 ...
- Linux中的文件描述符与打开文件之间的关系
Linux中的文件描述符与打开文件之间的关系 导读 内核(kernel)利用文件描述符(file descriptor)来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描 ...
- Linux中的文件描述符与打开文件之间的关系------------每天进步一点点系列
http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件. ...
随机推荐
- 简单入门echart方法
图表用echart, 然后前端的 HTML 跟 nodejs , nodejs 去调用 后端PHP的接口 链接:https://www.jianshu.com/p/1f2c37c5c02f 官网:h ...
- Java中的命名规范
Java中的命名规范 一. 常规约定 类一般采用大驼峰命名,方法和局部变量使用小驼峰命名,而大写下划线命名通常是常量和枚举中使用. 类型 约束 例 项目名 全部小写,多个单词用中划线分隔'-' spr ...
- KVM WEB管理工具 WebVirtMgr
一.webvirtmgr介绍及环境说明 温馨提示:安装KVM是需要2台都操作的,因为我们是打算将2台都设置为宿主机所有都需要安装KVM相关组件 github地址https://github.com/r ...
- pandas之画图
Pandas 在数据分析.数据可视化方面有着较为广泛的应用,Pandas 对 Matplotlib 绘图软件包的基础上单独封装了一个plot()接口,通过调用该接口可以实现常用的绘图操作.本节我们深入 ...
- [Linux]常用命令之【tar/zip/unzip/gzip/gunzip】
1 tar .tar与.gz有什么联系与区别? .tar 只是进行打包,并没有压缩. 则: 用tar-cvf进行打包 用tar-xvf进行解包. .tar.gz 是既打包又压缩 ,则: tar –cz ...
- 四月二十四号java基础知识
1.输入输出是指程序与外部设备或其他计算机进行交互的操作2.流(stream)是指计算机各部件之间的数据流动流的内容上划分:流分为字节流和字符流3.输入流:将数据从外设或外存(如键盘.鼠标.文件等)传 ...
- 【LeetCode动态规划#06】分割等和子集(01背包问题一维写法实战)
分割等和子集 分割等和子集 给你一个 只包含正整数 的 非空 数组 nums .请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等. 示例 1: 输入:nums = [1,5,11,5 ...
- Go For Web:踏入Web大门的第一步——Web 的工作方式
前言: 本文作为解决如何通过 Golang 来编写 Web 应用这个问题的前瞻,对 Golang 中的 Web 基础部分进行一个简单的介绍.目前 Go 拥有成熟的 Http 处理包,所以我们去编写一个 ...
- 【SpringMVC】(三)
HTTPMessageConverter HttpMessageConverter报文信息转换器,将请求报文转换为java对象,或将java对象转换为响应报文. 1 @ResquestBody Res ...
- 从原理聊JVM(二):从串行收集器到分区收集开创者G1
作者:京东科技 康志兴 1 前言 随着Java的进化过程,涌现出各种不同的垃圾回收器,从串行执行到并行执行,从高吞吐到低延迟,终极目标就是让开发人员专注于程序的代码书写而无需关注内存管理. JDK早期 ...