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系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件. ...
随机推荐
- vite项目生产环境去掉console信息【转载】
环境变量引入 通常去掉console为生产环境,即需要引入环境变量.具体请看这篇文章: vite项目初始化之~环境变量 注意 与webpacak相比,vite已经将这个功能内置到了,所以我们只需要配置 ...
- Laf v1.0 发布:函数计算只有两种,30s 放弃的和 30s 上线的
一般情况下,开发一个系统都需要前端和后端,仅靠一个人几乎无法胜任,需要考虑的特性和功能非常多,比如: 需要一个数据库来存放数据: 需要一个文件存储来存放各种文件,比如图片文件: 后端需要提供接口供前端 ...
- [Volo.Abp升级笔记]使用旧版Api规则替换RESTful Api以兼容老程序
@ 目录 原理分析 开始改造 更换基类型 重写接口 替换默认规则 在微服务架构中的问题 Volo.Abp 配置应用层自动生成Controller,增删查改服务(CrudAppService)将会以RE ...
- vue中的v-model 与 .sync
<input v-model="parentData"> //等同于 <input :value="parentData" @input=&q ...
- 一连串div跟随鼠标移动
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- internal java compiler error
1.导入Maven项目运行报错: 解决方法:找到File->Settings 修改配置 再次运行就可以了.
- Android ViewGroup的事件分发机制-源码分析
为了更好的理解ViewGroup的事件分发机制,我们在自定义一个MyLinerLayout. public class MyLinearLayout extends LinearLayout { pr ...
- java项目 学生成绩管理系统 (源码+数据库文件)
需要的私信我 备注来意:项目名称 来了就点个赞再走呗,即将毕业的兄弟有福了 文章底部获取源码 java项目 学生成绩管理 (源码+数据库文件)技术框架:java+springboot+vue+m ...
- CSS笔记(待完善)
CSS笔记 css权重 ID(100)> class(10)> element(1) css最高权重 !important 块元素(block) 可以设置宽度和高度,独立成行. h1~h6 ...
- LeetCode 周赛 341 场,模拟 / 树上差分 / Tarjan 离线 LCA / DFS
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 上周末有单双周赛,双周赛我们讲过了,单周赛那天早上有事没参加,后面做了虚拟竞赛,然后整个 ...