Linux之基础IO

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

一.关于文件的共识

1.即使是空文件也要在磁盘中占用空间,因为文件=文件数据+文件属性,空文件没有文件数据但是仍然有文件属性。

2.因为文件=文件内容+文件属性,所以对文件的操作无非就是对内容/属性的操作。

3.在一个C程序中调用了文件操作函数,如果程序没有被执行这些文件操作函数也不会执行;只有这个程序被执行了这些文件操作函数才会被调用;因此文件操作的本质就是进程和被打开文件之间的关系

4.文件的唯一标识是“文件路径+文件名”,如果不指明路径默认是当前路径。

什么是当前路径?

Linux之基础IO

当一个程序被执行时,其有关属性中有两个最显眼,一个是exe:表示当前执行的是哪个路径下的哪个程序;另一个是cwd:表示当前执行程序的工作目录

进程的工作目录就是这个进程的当前路径


Linux支持更改进程的当前路径,通过调用系统调用chdir(要更改的路径名)即可

Linux之基础IO

Linux之基础IO


二.复习C语言的文件操作

1.打开文件

Linux之基础IO

fopen打开文件:

1.”w“以写方式打开,如果不存在就创建,默认是覆盖式写(清空文件原内容,写入新内容);

2.”r“以读方式打开,如果文件不存在就出错

3.”r+“读写方式打开,不存在出错

4.”w+“读写方式打开,不存在就创建

5.”a“追加打开,在文件原内容后面添加新内容


2.向文件中写入数据

Linux之基础IO

按照%s%d的格式将后面的参数写入到f所指向的文件中

3.向文件中追加数据

Linux之基础IO

只要改变打开方式即可


三.有关文件的系统调用

每种语言都有自己的文件操作函数,但是要想访问文件是无法绕过操作系统的,无论是文件的打开关闭还是读写都要经由操作系统之手,而我们要向操作系统发送请求就必须要调用系统调用。

也就是说无论何种语言的文件操作函数都是对文件方面的系统调用的再封装,但是它们各自的封装都是不同的。直接学习系统调用就能有效减少学习成本,因为上层语言是变化的,但是底层的系统调用不变,并且上层语言依赖于下层系统调用


1.open(文件打开)

Linux之基础IO

标记位flags使用六个宏进行传参,他们分别是O_RDONLY(只读), O_WRONLY(只写),O_CREATE(创建), 和O_RDWR(读写),O_TRUNC(覆盖式写),O_APPEND(追加式写)

标记位利用了每个比特位只有01两种数字的特点,通过不同比特位中不同位置的1来表示不同的标记,所以对于flags中的五个宏的比特位序列一定是不同的

如果调用成功就返回打开文件的文件描述符,失败就返回-1

与open对应的系统调用接口是close,在打开文件以后最好手动调用close关闭文件


Linux之基础IO

在我们使用C语言的文件操作函数时,以写方式打开文件如果文件不存在就会自动创建;但是系统调用这里即使是写方式打开不存在的文件也会出错,因为C语言的文件操作函数在调用系统调用是flags传的参数是O_WRONLY|O_CREATE

Linux之基础IO

文件在创建时默认权限是666,目录是777,但是还要受到系统umask码值的影响,最终的权限是:默认权限&~umsak

当我们开始使用系统调用时发现相比语言来说操作并不是那么简单随意,因为此时语言所做的事就由我们自己来做了(我们长大了哦)

C语言创建文件默认的权限是正确的是因为它在使用open函数时还使用了第三个参数:

Linux之基础IO

如果文件已经存在就没必要在打开文件时还传入第三个权限参数

如果不想受系统umask的影响,可以使用系统调用umask来更改

Linux之基础IO


2.write(向文件写入)

Linux之基础IO
Linux之基础IO

这个输出结果好像不太对劲,虽然将wb和cnt正确输出了,但是为什么最后还有一个wbm1呢?

write是覆盖式写,并不会自动将文件清空,除非在open的时候加入O_TRUNC

Linux之基础IO

如果不想直接覆盖式写,可以将O_TRUNC改成O_APPEND

Linux之基础IO


3.read(读文件)

Linux之基础IO
Linux之基础IO

将fd代表的文件中的数据读取到buf所代表的缓冲区中


四.文件描述符

一个系统中一定存在着大量的被打开的文件,这些文件要被管理起来,因此操作系统对文件先描述后组织形成了struct file{}结构体,这个结构体包含了文件的大部分属性。

不但文件要被管理起来,每个文件的内核数据结构(struct file)也要被管理起来,所有就有了文件描述表(struct file_struct)。此时至少有一个这样的认识:
Linux之基础IO


1.进程如何找到自己的文件

一个进程可能打开不止一个文件,同时内存中又存在大量被打开的文件,那么进程如何知道哪些文件是属于自己的呢?答案是通过文件描述符表,文件描述符表是一个数组指针,它的每一个元素都是一个指针,指向一个文件的内核数据结构,每个进程的PCB中都有一个指针指向文件描述符表

现在将结构补全:

Linux之基础IO

每个进程的PCB中都存放了一个文件描述符表指针,通过这个指针就可以找到文件描述符表,该进程文件描述符表中元素所指向的文件都是该进程的文件

2.为什么文件的fd都是从3开始的

Linux之基础IO

通过上面的结构我们就很清楚的知道为什么当我打开一个文件时这个返回值是3,这个返回值其实是文件描述符的下标;

系统会默认打开标准输入流,标准输出流和标准错误,它们分别占了文件描述符的0,1,2下标,所以新打开的文件只能占用3下标了。

Linux之基础IO

3.FILE和fd的关系

想要访问文件绕不开操作系统,想让操作系统帮你找到某一个文件,你必须要有这个文件的文件描述符。因此,FILE这个结构体中必定要有文件描述符fd。

4.文件描述符的分配规则

系统调用close是用来关闭文件的,那么我可以关闭默认打开的三个标准文件吗?

Linux之基础IO

0下标的文件被关闭以后,新打开的文件下标就是0。这是因为文件描述符的分配规则是自上到下扫描找到最小且没有被占用的下标分配给新打开的文件

Linux之基础IO

当我将1关闭以后,再执行myfile,并没有输出任何东西,这点足以证明即使是三个默认被打开的文件也是可以通过close关闭的。

当我把1关闭以后,我新打开的文件就变成了那下标为1的文件,也就是说标准输出从显示器变成了我刚打开的文件,内容应该是输入到文件中了,我们打开文件看看:

Linux之基础IO

为什么什么也没有?

因为这里还涉及到一个缓冲区的问题,向显示器中刷新数据和文件中刷新的策略是不一样的

Linux之基础IO

我将本来应该打印到显示器上的内容打印到了文件中,这正好输出重定向


五.重定向

将本该打印到显示器的内容打印到某个指定的文件中就是输出重定向,所以说重定向的本质就是上层用的fd不变,在内核中更改fd对应struct file*的指向

1.如何改变标准输入/输出

改变标准输入/输出的本质是改变文件描述符表中0,1下标的内容

在文件描述符分配规则中先关闭标准输入/输出,在打开一个新文件,此时这个新文件就会占用刚刚关闭的标准输入/输出流的位置,这是一种改变方法,但这样写有些太挫。

操作系统提供了dup2的系统调用,用于改变标准输入/输出:

Linux之基础IO

dup2就是将oldfd中的内容,拷贝到newfd中

通过dup2系统调用就能很轻松的实现重定向的功能。

2.输出和追加重定向

a.输出重定向

因此之间的输出重定向可以写成这样:

Linux之基础IO

结果变成了3,这是因为dup2是一种拷贝,最后newfd和oldfd都变成了oldfd的内容,也就是说新打开的文件仍然是被文件描述符表中的3下标中的指针指向,但是代表标准输出的0下标中的struct file*也指向了新打开的文件。

b.追加重定向

Linux之基础IO

追加重定向也是输出重定向的一种,原本追加的内容是直接打印到显示器上,现在也放到了文件中


3.输入重定向

Linux之基础IO

所谓输入重定向就是将文件中的内容读取出来并打印到显示器上

4.子进程重定向会影响父进程吗

子进程的重定向不会影响父进程,子进程在创建时是以父进程为模型的,它会拷贝父进程的部分内核数据结构其中就包括了文件描述符表,子进程中文件描述符表的struct file*的指向变了,关我父进程什么事。

进程具有独立性,所有它们的文件描述符表也是各自持有一份。

六.Linux如何做到一切皆文件

一切皆文件的难点在于如何将硬件也作为文件来看待:

Linux之基础IO

操作系统对每一个文件先描述后组织形成了struct file内核数据结构,在这个内核数据结构中存放了文件的大部分属性,其中还包含着一大批函数指针,这些函数指针指向的是某个文件的具体读写方法。

虽然每个文件都是不一样的,但是文件的属性有很大的相似性,为了方便管理可以将文件抽象成文件属性,对文件的描述就是对文件的属性描述,因为管理的本质是对数据进行管理。

将硬件用同样的方式来管理,将硬件的读写方法抽象成函数指针,各种属性抽象到struct file内核数据结构中。

当我站在struct file之上来看,所有的东西包括硬件都是统一由struct file来管理的,所以对我来说硬件也就和文件一样了。因此就造成了一种一切皆文件的现象。文章来源地址https://www.toymoban.com/news/detail-417029.html

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

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

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

相关文章

  • Linux 学习笔记(2)—— 关于文件和目录

    目录 1、切换目录 2、查看系统信息 3、文本的创建和编辑 3-1)创建文件  3-2)查看文件 3-3)输出重定向和追加重定向等 3-4)使用 vi 编辑器编辑文件 4、文件和文件夹的处理 4-1)对文件的处理  4-2)查看目录信息 4-3)对目录的操作 5、文件查找 6、查找文件中的内容 7、使用

    2024年02月09日
    浏览(68)
  • Linux shell脚本set -e原理(set -o errexit 命令出错退出)(|| true屏蔽前面子命令返回值)(用if判断即使命令返回值不为零也不会退出)

    set -e 是 Linux shell 中的一个选项,它的作用是在脚本执行过程中,一旦出现任何命令执行失败(返回非零的退出状态码),脚本就会立即退出。 具体原理如下: 当设置了 set -e 选项后,shell 会在每个命令执行后检查其退出状态码。 如果命令的退出状态码为非零,表示命令执行

    2024年02月22日
    浏览(49)
  • 关于nginx的linux命令 以及 基本配置文件的配置

    nginx介绍 反向代理,https,动静分离(web 服务),负载均衡 (反向代理),web 缓存 内存少,并发能力强(支持50,000 个并发) 配置文件默认是放在/usr/local/nginx/conf/nginx.conf,配置文件中默认有三大块:全局块、events块、http块。 我们主要修改http块: 反向代理 server { location

    2023年04月23日
    浏览(58)
  • linux文件比较工具diff-关于参数-pN的设置方法

    非纯文本文件比较可用cmp命令 第一:利用diff创建分析文件,处理补丁(patch)功能的文件 案例:多数用于同一软件的不同版本之间,比如比较配置文件和源文件的区别,生成补丁文件,执行更新,或者恢复操作 以’行‘为单位进行比较,多数用在同一文件新旧版本的比较上

    2024年01月19日
    浏览(53)
  • linux关于ssh免密登录、known_hosts文件

    1. 关于ssh SSH 是 Secure Shell 的缩写,SSH 为建立在应用层基础上的安全协议。SSH 是目前广泛采用的安全登录协议,专为远程登录会话和其他网络服务提供安全性的协议,替代以前不安全的Telnet协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。 scp、sftp等都是基于

    2024年02月16日
    浏览(40)
  • 区块链基础知识(下):共识机制 附带图解、超详细教学 看不懂你打死我

          苏泽 大家好 这里是苏泽 一个钟爱区块链技术的后端开发者 本篇专栏  ← 持续记录本人自学两年走过无数弯路的智能合约学习笔记和经验总结 如果喜欢拜托三连支持~ 目录 专栏的前面几篇详细了介绍了区块链的核心基础知识 有兴趣学习的小伙伴可以看看→ 关于区块

    2024年03月13日
    浏览(55)
  • allegro焊盘中空(透明)显示设置方法

    allegro默认设置的焊盘显示方式占用空间大,当板卡为双层板且紧凑时,显示的焊盘会挡住有效信息且不够美观。可以将焊盘设置为中空(中间透明),只显示边沿的方式。 【默认效果】 【修改后效果】 【修改方法】

    2024年02月12日
    浏览(47)
  • 标普500指数下跌2.4%至盘中低点

    行情显示,标普500指数下跌2.4%至盘中低点;纳斯达克100指数重挫3.5%。 MicroStrategy跌至18个月低点 金色财经报道,由于加密货币价格继续与金融市场同步下跌,MicroStrategy周二交易于18个月低点。据数据显示,MichaelSaylor的软件公司的股价在撰写本文时为188.50美元。这意味着过去

    2023年04月24日
    浏览(56)
  • Linux 文件-基础IO

    文件=内容+属性 1 所有对文件的操作可分为两类:a 对内容操作 b 对属性操作 2 内容是数据,属性也是数据,存储文件必须既要存储内容,也要存储属性数据    默认文件在磁盘上 3 进程访问一个文件的时候,都要先把这个文件打开    打开前:普通的磁盘文件    打开后:将

    2024年02月22日
    浏览(50)
  • 【Linux基础】库文件

    (꒪ꇴ꒪ ),hello我是 祐言 博客主页:C语言基础,Linux基础,软件配置领域博主🌍 快上🚘,一起学习! 送给读者的一句鸡汤🤔: 集中起来的意志可以击穿顽石! 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏 ​​         在Linux系统中,库文件(Library files)是一

    2024年02月16日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包