Linux之从进程角度来理解文件描述符

这篇具有很好参考价值的文章主要介绍了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

我们也可以创建一个同时可读可写的文件描述符;文章来源地址https://www.toymoban.com/news/detail-461773.html

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之从进程角度来理解文件描述符的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux进程描述指令:ps与top

    显示系统中的所有进程 PID就是进程的唯一编号,操作系统书里有一个PCD的概念,就是一个标识性的控制单元 概念解释 显示终端上的所有进程,包括其他用户的进程 显示进程的详细状态 显示没有控制终端的进程 输入top后,输入P,按照CPU的使用率排序 M:以内存的使用率排序

    2024年02月02日
    浏览(35)
  • 【Linux】从软硬件角度重新理解 [ 操作系统与冯诺依曼体系 ](8)

    ​ 前言 大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁,从软硬件层面向大家介绍操作系统与冯诺依曼体系, 主要内容含: 欢迎订阅 YY 滴Linux专栏!更多干货持续更新!以下是传送门! 订阅专栏阅读: YY 的《Linux》系列 ❀❀❀❀❀ 【

    2024年02月08日
    浏览(36)
  • 【闪击Linux系列P8】从软硬件角度重新理解 [ 操作系统与冯诺依曼体系 ]

    ​ 前言 大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁,从软硬件层面向大家介绍操作系统与冯诺依曼体系, 主要内容含: 欢迎订阅 YY 滴Linux专栏!更多干货持续更新!以下是传送门! 订阅专栏阅读: YY 的《Linux》系列 ❀❀❀❀❀ 【

    2024年02月13日
    浏览(35)
  • 【Linux】进程排队的理解&&进程状态的表述&&僵尸进程和孤儿进程的理解

             进程不是一直运行的,进程可能会在等待某种软硬件资源。即使把进程加载到CPU中,也不是一直会运行的。而进程排队,一定是在等待某种软硬件资源(可以是CPU,键盘,磁盘,网卡等等设备......), 排队时是进程的PCB在排队 。 在这里就需要引入一个概念: 一

    2024年03月21日
    浏览(45)
  • 【Linux】进程学习(1)---理解进程概念

    数学家冯·诺依曼提出了计算机制造的三个基本原则,即采用二进制逻辑、程序存储执行以及计算机由五个部分组成(运算器、控制器、存储器、输入设备、输出设备),这套理论被称为冯·诺依曼体系结构。我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大

    2023年04月25日
    浏览(58)
  • 【Linux】进程理解与学习Ⅳ-进程地址空间

    环境:centos7.6,腾讯云服务器 Linux文章都放在了专栏:【 Linux 】欢迎支持订阅 🌹 相关文章推荐: 【Linux】冯.诺依曼体系结构与操作系统 【Linux】进程理解与学习Ⅰ-进程概念 浅谈Linux下的shell--BASH 【Linux】进程理解与学习Ⅱ-进程状态 【Linux】进程理解与学习Ⅲ-环境变量 在

    2023年04月14日
    浏览(81)
  • 【Linux】Linux进程控制 --- 进程创建、终止、等待、替换、shell派生子进程的理解…

    柴犬: 你好啊,屏幕前的大帅哥or大美女,和我一起享受美好的今天叭😃😃😃 1. 在调用fork函数之后, 当执行的程序代码转移到内核中的fork代码后 ,内核需要分配 新的内存块 和 内核数据结构 给子进程, 内核数据结构包括PCB、mm_struct和页表,然后构建起映射关系 ,同时

    2024年01月16日
    浏览(58)
  • 【linux】:linux下文件的使用以及文件描述符

    文章目录 前言 一、linux系统中的文件操作以及文件接口 二、文件描述符 1.文件描述符的分配规则 2.重定向 总结 理解文件原理和操作: 我们先快速回忆下一C语言的文件操作:  首先看一下fopen函数的使用,然后我们写一段简单的C语言打开文件的代码如下图: 接下来我们运行

    2023年04月13日
    浏览(44)
  • 【Linux】理解进程地址空间

    🍎 作者: 阿润菜菜 📖 专栏: Linux系统编程 ​我们在学习C语言的时候,都学过内存区域的划分如栈、堆、代码区、数据区这些。但我们其实并不真正理解内存 — 我们之前一直说的内存是物理上的内存吗? 我们先看一段测试代码: 运行结果: 我们可以注意到子进程的变量

    2024年02月02日
    浏览(53)
  • 【Linux】进程理解

    进程是系统进行资源分配的基本单位,是程序加载到内存后的执行过程。 进程一般由数据段,代码段和进程控制块三部分组成。系统通过进程控制块感知进程的存在并对进程进行控制。由于 进程之间空间相互独立 ,多进程比多线程更安全,一个进程基本上不会影响另外一个

    2024年02月09日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包