周口市做网站软件定制开发费用
- 作者: 五速梦信息网
- 时间: 2026年03月21日 03:50
当前位置: 首页 > news >正文
周口市做网站,软件定制开发费用,高端网球拍,嘉鱼网站建设公司前面介绍了与文件相关的各种操作#xff0c;其中的各个接口都离不开一个整数#xff0c;那就是文件描述符#xff0c;本文将介绍文件描述符的一些相关知识。 目录 1现象 2原理 文件fd的分配规则和利用规则实现重定向 1现象 我们可以先通过prin…前面介绍了与文件相关的各种操作其中的各个接口都离不开一个整数那就是文件描述符本文将介绍文件描述符的一些相关知识。 目录 1现象 2原理 文件fd的分配规则和利用规则实现重定向 1现象 我们可以先通过printf把文件描述符打印出来我们可以多打开几个文件看看文件描述符有什么特别再解释原理 #includestdio.h #includeunistd.h #includestring.h #includefcntl.h #includesys/stat.h #includesys/types.h#define filename file.txt int main() {int fd1 open(log1.txt,O_WRONLY|O_CREAT|O_TRUNC,0666);int fd2 open(log2.txt,O_WRONLY|O_CREAT|O_TRUNC,0666);int fd3 open(log3.txt,O_WRONLY|O_CREAT|O_TRUNC,0666);int fd4 open(log4.txt,O_WRONLY|O_CREAT|O_TRUNC,0666);int fd5 open(log5.txt,O_WRONLY|O_CREAT|O_TRUNC,0666);printf(fd1:%d\n,fd1);printf(fd2:%d\n,fd2);printf(fd3:%d\n,fd3);printf(fd4:%d\n,fd4);printf(fd5:%d\n,fd5);return 0; } 运行结果 可以看见文件的描述符从3开始增加在3之前的0 1 2 其实已经被用掉了。看到这些数字其实我们可以联想到数组的下标(因为文件描述符不能小于0)那么我们就可以假设一个文件描述符就代表该文件在某一数组中的位置(至于这个数组是什么后面详谈)那是谁用了0 1 2 呢其实是标准输入、输出和错误三个文件。 2原理 前面介绍过文件的几种系统调用的接口我们不难发现这些接口其实和C语言库中的文件操作函数非常相似实际上C语言的文件操作函数就是封装系统调用接口。既然C语言底层是系统调用接口那我们在使用C语言的文件函数这些系统调用接口所需要文件描述符在哪里呢 当然是在FILE 这个结构体当中这个结构体是C标准库自己封装的一个结构体。 既然FILE这个结构体中含有文件描述符那我们就可以通FILE来查看标准输入、输出和错误的文件的文件描述符是多少。下面演示一下代码 #includestdio.h #includeunistd.h #includestring.h #includefcntl.h #includesys/stat.h #includesys/types.h#define filename file.txt int main() {printf(%d\n,stdin-_fileno); // _fileno是FILE结构体中文件描述符的成员名printf(%d\n,stdout-_fileno);printf(%d\n,stderr-_fileno); } 运行结果 这就印证了0 1 2 这三个文件描述符是一开始就被标准输入、输出和错误占用了。 文件描述符的具体含义 前面说过打开文件的进程所以研究文件的各种操作就是研究进程与磁盘数据的关系。而我们在日常运行进程时我们可能要打开很多的文件对于这些文件系统自然是需要管理的。而在linux中OS就通过创建了一个file的结构体(别的系统也有可能是其他的数据结构)来描述一个被打开的文件file这个结构体中包含了很多内容这里比较重要的是文件属性、方法集和缓冲区。而这些文件的file又可以通过指针链接起来。进程PCB中有一个结构体指针该结构体指针指向的结构体是用于描述该进程打开的所有文件它也称为文件描述表其中就包含了每个文件的file指针。 所以当我们需要打开一个新文件时先在磁盘中找到对应的位置然后生成新的struct file初始化struct file中的数据并将其指针填入struct file* fd_array[] 中最后再将对应fd_array的下标返回给上层我们就可以使用返回的fd进行文件操作。而我们如果要关闭文件时就释放对应的struct file。 题外话 在linux中我们把所有的东西都看成文件底层的硬件设施也可以看成文件。对于这些硬件肯定有读方法和写方法这些硬件的读写方式肯定是不一样的。但我们可以用一个struct file来描述这些读写方法并将这些不同的读写方法重名成相同的函数名这样我们在调用硬件的一些函数时就可以忽略底层的差异直接使用上层的接口 文件fd的分配规则和利用规则实现重定向 直接先说规则最小的没有被使用的数组下标会分配给最新打开的文件。我们用一段代码演示一下上述的规则。 从运行结果上来看我们关闭了文件描述符为0的文件然后重新创建了一个log1.txt文件(该文件之前不存在)。这个新建文件的文件描述符为零不是3说明上述的分配规则是正确的。 输出重定向 我们先用一段代码实现一下输出重定向再解释一下原理 #includestdio.h #includeunistd.h #includestring.h #includefcntl.h #includesys/stat.h #includesys/types.h#define filename file.txt int main() {close(1);int fd open(log1.txt,O_WRONLY|O_CREAT|O_TRUNC,0666);printf(fd:%d\n,fd);return 0; } 运行结果 这里我们可以发现运行代码时显示器上并没有显示出对应的文件描述符。而log1.txt文件里面出现了对应的文件描述符。这就是我们所熟悉的输出重定向因为printf这个函数底层只认fileno 文件描述符在struct file里面的成员名。而这里我们把标准输出文件关闭了给打开的log1.txt分配的文件描述符就是1printf只会朝文件描述符为1的文件里面打印。所以才会出现上述现象。以此类推我们也可以写出输入重定向下面演示一下 先创建一个long.txt文件向里面写入一些内容(这里为了方便演示我只输入了一段数字)然后关闭stdin(也就是标准输入)然后系统给long.txt分配文件描述符为0使用scanf读取数据而scanf只认文件描述符为0的文件所以scanf会从long.txt中读取数据。 #includestdio.h #includeunistd.h #includestring.h #includefcntl.h #includesys/stat.h #includesys/types.h#define filename file.txt int main() {close(0);int fd open(long.txt,O_RDONLY);int a 0;scanf(%d,a);printf(%d\n,a);return 0; } 运行结果 同理如果我们需要实现追加重定向我们只需要在原来输出重定向的基础上把打开文件的方式中的O_TRUNC修改成O_APPEND即可其余的均不变。、 dup2函数 像上述实现重定向的方式颇为繁琐有没有更好的方式呢当然是有的。这里文件描述符代表的数组里面存的是struct file的指针如果我们要实现重定向只要将数组对应下标的内容进行交换即可。而这里由于stdout可以不被使用所以我们可以把新打开文件对应的指针直接拷到stdout对应的数组下标中即可。 这里有专门的系统调用来帮我们实现这一功能这个接口就是dup2(另外两个暂时不学)。 这个函数会把对应数组下标的内容拷贝到另外一个数组下标的对应内容上而在这里就是把oldfd对应的数组下标内容拷贝到newfd对应数组下标的内容里面所以最后只剩下oldfd对应数组下标内容。 如果要实现重定向操作我们就不需要再关闭文件描述符只需要使用dup2这个接口即可。 以上就是全部内容如果文中有不对之处还望各位大佬指正谢谢
- 上一篇: 舟山网站制作公司东莞哪家公司做网站好
- 下一篇: 周口网站推广能源企业 网站建设
相关文章
-
舟山网站制作公司东莞哪家公司做网站好
舟山网站制作公司东莞哪家公司做网站好
- 技术栈
- 2026年03月21日
-
舟山市建设信息港网站打不开广告投放推广平台
舟山市建设信息港网站打不开广告投放推广平台
- 技术栈
- 2026年03月21日
-
舟山市建设局网站集约化网站建设的核心
舟山市建设局网站集约化网站建设的核心
- 技术栈
- 2026年03月21日
-
周口网站推广能源企业 网站建设
周口网站推广能源企业 网站建设
- 技术栈
- 2026年03月21日
-
周口学做网站坪山网站建设价位
周口学做网站坪山网站建设价位
- 技术栈
- 2026年03月21日
-
周浦手机网站策划建设公司公司门户网站制作
周浦手机网站策划建设公司公司门户网站制作
- 技术栈
- 2026年03月21日

