版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hanani_Jia/article/details/82717385
上次我们介绍了Linux中基础IO的系统调用,这次我们介绍的是文件描述符。
文件描述符是我们之前所没有接触到的一个名词。内核是利用文件描述符来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。但是文件描述符这个概念是只有在Linux和unix才有。
在Linux下有一句话是一切皆文件,文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。
习惯上,标准输入(standard input)的文件描述符是 0,标准输出(standard output)是 1,标准错误(standard error)是 2。POSIX 定义了 STDIN_FILENO、STDOUT_FILENO 和 STDERR_FILENO 来代替 0、1、2。这三个符号常量的定义位于头文件 unistd.h。文件描述符的有效范围是 0 到 OPEN_MAX。一般来说,每个进程最多可以打开 64 个文件(0 — 63)。这里还想说一个东西就是,为什么要弄一个错误输出,为什么会有一个专门针对错误的特殊文件?这是由于很多人喜欢把错误单独保存到一个文件中,特别是在处理大的数据文件时,可能会产生很多错误。
如果没有特别指定文件说明符,命令将使用缺省的文件说明符(你的屏幕,更确切地说是你的终端)
这里我们通过一个程序来查看文件描述符
可以看这里输出的是3.也就是证明了0.1.2已经是被我们的系统占了。我们可以修改一下我们的程序
我们去吧文件描述符0给关了。这时候再去输出我们自己创建的文件描述符。这里我们也可以关闭2,但是不要关闭1,之后我们会介绍一下为什么不能关闭1.
这时候就能发现我们这次创建的文件描述符变成了0.
所以文件描述符创建是有一定的规则。在创建文件描述符的时候系统会在files_struct数组中,去找到一个当前没有被使用的一个最小下标,作为一个新的文件描述符。
上边我们说了不要关闭1,这里我们尝试一下关闭1会有什么后果。不过这里不能是特别单纯的去修改1,我们还需要修改一下打开文件的类型