文件fd.

这篇具有很好参考价值的文章主要介绍了文件fd.。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

共识原理:
1.文件 = 内容 + 属性

2.文件分为打开的文件 和 没打开的文件

3.打开的文件: 谁打开? 进程! ----本质是研究进程和文件的关系!
根据冯诺依曼原理,文件被打开,必须先被加载到内存!不然CPU怎么访问它
那么是文件内容被加载?还是属性被加载?还是都被加载?
一定要先把属性加载到内存,内容要不要被加载取决于要不要对文件做修改,理想情况是都被加载

一个进程可以打开多个文件,则进程与打开文件数量关系为
进程:打开的文件 = 1 :n
则操作系统内部,一定存在大量的被打开的文件!
------0S要不要管理这些被打开的文件呢? ----怎么管理???—先描述,在组织 — 在内核中,一个被打开的文件都必须有自己的文件打开对象,包含文件的很多属性。struct XXX{文件属性; struct XXX*next}; 用双链表组织起来

4.没打开的文件:∶在哪里放着呢? 在磁盘上。我们最关注什么问题?没有被打开的文件非常多。文件如何被分门别类的放置好…我们要快速的进行增删查改…快速找到文件
如何存储?

本文目标主要先研究被打开的文件

1、以C语言为主,先回忆一下C文件接口
打开文件的路径和文件名,默认在当前路径下新建一个文件,fopen中当前路径是什么?
当前路径,进程的当前路径cwd —如果我更改了当前进程的cwd(chdir),就可以把文件新建到其他目录

文件fd.,Linux,linux
文件fd.,Linux,linux

文件fd.,Linux,linux

ls /proc/进程ID 可以查看进程task_stuct的绝大多数属性,cwd就是进程环境变量pwd改了个名字来的
文件fd.,Linux,linux
下面用fwrite进行写入一段字符串
文件fd.,Linux,linux
文件fd.,Linux,linux
更改字符串由hello linux -> abcd 发现并不是abcdo linux 而是只有abcd

w方式打开的特性:
如果以w方式打开,如果文件不存在会创建一个
w : 写入之前,会对文件进行清空处理,并且从文件开始写入

观察输出重定向,盲猜一波它本质一定是打开这个文件并且是w模式打开的,因为他会先清空
文件fd.,Linux,linux
问题:对文件进行写入字符串时,要不要把\0也加上?
文件fd.,Linux,linux
答:字符串以\0结尾,是你C语言的规定,和我文件有什么关系? ??

a 方式打开 追加写
文件fd.,Linux,linux
则 > 和 >> 一定是打开方式的区别 w / a

C程序默认再启动的时候帮我们打开三个流,标准输入stdin,标准输出stdout,标准错误stderr
这三个输入输出流就是文件
文件fd.,Linux,linux

在C语言看来 向显示器写入和向文件写入没有区别
因为Linux下一切皆文件,所以我们可以不用printf,直接用文件fprintf等接口直接向显示器写入
文件fd.,Linux,linux
那么问题来了
1、如何理解 Linux一切皆文件?
2、三个标准流为什么所有语言都要支持,它到底是什么?怎么做到的?

2、过渡到系统,认识文件系统调用
文件在磁盘上,磁盘是外部设备,访问文件其实是在访问硬件!
根据计算机体系层状结构和操作系统不相信任何用户,则C语言访问文件的库函数一定封装了文件系统调用接口!利用系统调用贯穿操作系统访问硬件
文件fd.,Linux,linux
认识几个文件系统调用
1、open
文件fd.,Linux,linux
对于flags是标志位,代表只写/追加/没有创建新文件/清空…
我们要是自己写可能在形参直接干上2~3以上标志位,但其实一个整形本来就有32位,可以利用一个Bit位代表一个状态
我们可以用一种优雅的方式来完成这个工作。做到只传一个int flags来完成标记
手册中看到O_RDONLY,O_WRONLY,这一看就是个宏,只有一个bit位是1,代表不同的状态!
文件fd.,Linux,linux
比特位级别的标志位传递方式:
falgs提供了很多宏,只有一个Bit位为1,他可以传递多种标志位做按位或的组合,在函数内部再一与,就可以调用不同的功能函数
文件fd.,Linux,linux
文件fd.,Linux,linux
再回到open上来
1、O_WRONLY不会创建文件,如果文件不存在就打开失败,open返回值为-1,则需要或上O_CREAT
文件fd.,Linux,linux

2、即使标志位为O_WRONLY|O_CREAT 新建文件权限为随机值,所以创建文件必须告诉Open第三个形参权限
文件fd.,Linux,linux
文件fd.,Linux,linux
0666为八进制,rw- rw- rw- ,可结果是664 那么是因为掩码的存在
文件fd.,Linux,linux
umask默认002 也是八进制 可以通过更改umask的方式来就让文件权限是666
系统调用umask
文件fd.,Linux,linux
文件fd.,Linux,linux

open周边问题
返回值fd是啥?
file descriptor : 文件描述符, 是一个整数

系统调用close
文件fd.,Linux,linux

系统调用write
文件fd.,Linux,linux
文件fd.,Linux,linux
通过上面代码进行测试后,我们发现库函数fopen以w / a 方式必定封装了这两种系统调用

文件fd.,Linux,linux

在接口层面fopen封装了open,那么在返回值数据类型FILE* fp和 int fd什么关系呢?

3、访问文件的本质
左边是进程与文件有关的,右边是文件管理,他们通过数组下标产生关联
操作系统对多个被打开的文件进行管理,先描述再组织,进程打开open某个文件就去文件描述符表中找一个空的位置把文件struct file的地址填进去,最后再把数组下标返回给上层用户,这样当你write时,通过fd就能从PCB找到文件描述符表在找到下标存着的文件对象指针找到你要写入的文件了
文件fd.,Linux,linux
结论:int fd : 本质是数组的下标

如果在进程中open打开多个文件,发现确实是数组下标,而是都是从3开始,那么0,1,2呢?对于失败打开返回-1
文件fd.,Linux,linux
细心的就会发现C语言默认打开的三个流正好对应了3个位置,但是操作系统不认识什么stdin,stdout,它只认识fd,即为0,1,2
为什么所有语言都支持这三个流,哪有这么巧,那是因为操作系统默认打开的,
别和我说你打开了三个流,而是操作系统打开了你直接用的,那么OS为什么要默认打开呢?
因为计算机开机时你的显示器和键盘已经被OS打开了,编程时必须键盘输入和显示器查看结果,所以语言默认都给我们打开了。开机识别后默认就打开显示器和键盘了,所以启动一个进程时只需要把你打开的显示器文件和键盘文件地址填入文件描述符表中就可以了,程序员天然需要这两个键盘输入和显示器看结果
文件fd.,Linux,linux
验证:我们代码中直接向0,1 输入和输出,证实了上面的结论
文件fd.,Linux,linux

回答上面遗留的问题
关于FILE是什么呢?文件fd.,Linux,linux
FILE是C库自己封装的结构体,这里面必须封装文件描述符
文件fd.,Linux,linux
FILE结构体中封装了fd,fwrite调用系统调用write时才能通过指针指向的fd才能成功调用
验证:
结构体中可以随意访问成员,又不像C++还要权限
文件fd.,Linux,linux
这三个家伙不就是FILE结构体指针吗,那我当然可以访问它的成员fd
文件fd.,Linux,linux

问题
为什么我把显示器1关了,2还能打印呢?
文件fd.,Linux,linux
1号关闭了,但是2 号还是只想显示器的,他们两个是分开的,所以往2号打印能显示

close与引用计数
一个文件是可以被多个文件描述符打开的,比如1,2号都指向显示器
struct file中包含了引用计数count字段,包含了引用计数,几个文件描述符指向我,Count就是几,
所以close时,将count–,并且将文件描述符下标数组内容制空,之后判断引用计数count是不是为0,不为0文件还有其他人再引用,为0 了那么系统会回收这个对象

文件fd.,Linux,linux

4、重定向 && 缓冲区文章来源地址https://www.toymoban.com/news/detail-739181.html

到了这里,关于文件fd.的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向

    作者:დ旧言~ 座右铭:松树千年终是朽,槿花一日自为荣。 目标:了解在Linux下的系统文件IO,知道什么是文件描述符,什么是重定向 毒鸡汤:白日莫闲过,青春不再来。 专栏选自:Linux初阶 望小伙伴们点赞👍收藏✨加关注哟💕💕 最早我们在C语言中学习关于如何用代码

    2024年04月14日
    浏览(40)
  • 【linux深入剖析】文件描述符 | 对比 fd 和 FILE | 缓冲区

    🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 通过对open函数的学习,我们知道了文件描述符就是一个小整数 而现在知道,文件描述符就是从0开始的小

    2024年04月13日
    浏览(39)
  • Linux查看进程运行输出(/proc/<pid>/fd)

    输入ps或ps -ef root@TinaLinux:/proc/631/fd# ps PID   USER     TIME   COMMAND     1 root       0:03 /sbin/procd ...........   631 root       0:06 ./rt_agent   694 root       0:00 [kworker/2:2]   771 root       0:23 /home/upg/fupg 要查看的进程id为631。 切换到/proc/pid/fd下,如 root@TinaLinux:~# cd /proc/631/fd root@TinaLin

    2024年02月11日
    浏览(42)
  • 文件fd.

    共识原理: 1.文件 = 内容 + 属性 2.文件分为打开的文件 和 没打开的文件 3.打开的文件: 谁打开? 进程! ----本质是研究进程和文件的关系! 根据冯诺依曼原理,文件被打开,必须先被加载到内存!不然CPU怎么访问它 那么是文件内容被加载?还是属性被加载?还是都被加载? 一定

    2024年02月06日
    浏览(29)
  • Emacs之改造最快的文件搜索工具fd-dired(基于fd命令)(一百二十一)

    简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏: Audio工程师进阶系列 【 原创干货持续更新中…… 】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:An

    2024年02月15日
    浏览(32)
  • 系统文件IO、文件描述符fd、重定向、文件系统、动态库和静态库

    C文件接口 C文件接口都是封装了系统的文件接口,学习系统的文件接口有利于更熟悉文件的操作。 open函数 头文件 #include sys/types.h #include sys/stat.h #include fcntl.h 函数描述 int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); 参数 pathname: 要打开或创建的目

    2024年02月07日
    浏览(34)
  • FD_SET设置的文件描述符超过1024引发coredump

    在开发过程中,遇到一个coredump的问题,最后排查到是FD_SET的文件描述符大于1023 2、开始执行 这种问题就更坑人了,并不是只要超过1023就会必现,到1200就快复现了 3、gdb调试 这里还好,最起码gdb报的行数是在36,在FD_SET这行,在自己的开发环境就没这么好了 3、内核里面 FD

    2024年02月13日
    浏览(41)
  • 【linux】linux系统压缩文件与解压文件

    linux系统中的压缩包有: zip,tar,gzip tar格式:简单的打包,并不会压缩,所以实际上打包好的压缩包是比源文件大的。 gzip格式:这个格式是通过一定的算法,把源文件大小进行压缩后打包,实际压缩包会比源文件小。 语法: tar [参数们] 文件1 文件2 文件3 参数: -c 创建压

    2024年01月18日
    浏览(28)
  • Linux tar命令详解,Linux备份解压文件_linux tar备份文件

    一、常用操作 1. 压缩/备份文件 2. 查看压缩文件 3. 解压文件 二、注意事项 1. 操作类型要放在前面 作用:将多个文件打包成一个文件,方便文件传输,也可以用来备份文件,打包过程中支持压缩。 参数: -z 用gzip指令处理备份文件 -v 显示执行过程 -f 指定备份文件 -c 建立备份

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

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

    2023年04月13日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包