UNIX环境高级编程_文件IO_文件描述符

这篇文章记录文件描述符,下一篇文章记录文件描述表。

1 文件描述符

先说说什么是文件IO。文件的IO就是文件的输入输出,也就是文件的读写。读和写是以CPU为参考的,从CPU向文件中写入数据,就是写操作;从文件中读取数据就是文件的读操作。
在这里插入图片描述

1.1 什么是文件描述符?

当我们用open函数打开一个文件,打开成功返回一个非负整数(0,1,2…1023),这个非负整数指向了打开的文件,这就是文件描述符。比如,用open打开一个文件,打印出文件描述符,如下图所示。
在这里插入图片描述

1.2 文件描述符池

系统给每个进程分配0~ 1023的文件描述符范围,也就是说每个进程打开文件时,open所返回的文件描述符是0~ 1023范围中的某个数字。文件描述符0~1023这个范围,其实就是文件描述符池。

1.3 在程序中第一个打开的文件,为什么返回的是3?

open返回文件描述符是有规则的:open返回文件描述符池中,当前最小没用的一个。程序运行后,0/1/2默认就被使用了,文件描述符0与进程的标准输入关联,文件描述符1与标准输出关联,文件描述符2与标准错误关联。所以,打开一个文件描述符池中最小没被用的是3。如果又打开一个文件,最小没被用的就应该是4,所以open返回的应该是4。

1.4 文件关闭后,被占用的描述符怎么办

当文件关闭后,当前文件的描述符会被释放,等着下一次open时,被重复利用。当文件被关闭后,文件描述符被收回到文件描述池中,

1.5 open的文件描述符 与 fopen的文件指针

1.5.1 open:Linux 的系统函数(man 2 系统函数)

open成功后,返回的文件描述符,指向了打开的文件。

1.5.2 fopen:C库的标准io函数(man 3 库函数)

#include <stdio.h>				
FILE *fopen(const char *path, const char *mode);

fopen成功后,返回的是FILE *的文件指针,指向了打开的文件。

1.5.3 fopen和open关系

fopen只是对open这个函数做了二次封装。fopen的文件指针,最终还是会被换成open的文件描述符,然后用于去操作打开的文件。
在这里插入图片描述

1.6 errno和错误号

如果open失败了,只是笼统的打印出“打开文件失败了”,但是并没有提示具体出错的原因,没有详细的出错原因提示。如何具体打印出详细的出错信息呢?这就是errno的作用了。

1.6.1 什么是ernno

errno是Linux中的一个全局变量。函数调用出错时,Linux系统使用错误编号(整形数)来标记具体出错的原因,每个函数有很多错误号,每个错误号代表了一种错误,产生这个错误时,会自动的将错误号赋值给errno这个全局变量。
如何知道某一个错误号对应的是什么错误呢?比如,下图中错误号等于2,表示什么错误呢?就要用到下面的perror库函数了。
在这里插入图片描述

1.6.2 perror函数自动将“错误号”换成对应的文字信息,并打印出来

man 3 perror,perror是一个C库函数,不是一个系统函数。
在这里插入图片描述
在这里插入图片描述
上面输入一个错误路径,用perror打印对应的错误信息。

1.6.3 perror工作原理

perror的工作原理: 调用perror函数时,它会自动去找到一张对照表,将errno中保存的错误号,换成具体的文字信息并打印出来,我们就能知道函数的具体错误原因了。
在这里插入图片描述

1.6.4 如何查看错误号

每个错误号代表了一种函数可能的出错情况,通过man perror 这个函数,就可以查看错误号了。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值