最近在看“UNIX环境高级编程(第二版)”, 其中文件描述符,进程,线程等经常出现在书本中,关于这几个几本的概念,也经常和同事Jerry讨论,他们是做什么的? 在和WEB开发中有什么联系等等问题….其中文件描述符这个概念始终有点困扰着我,下面我把网上整理和自己的体会,写出来,就当学习笔记吧,如有不当,请指正

我们去wiki看看怎么解释文件描述符的

http://zh.wikipedia.org/wiki/文件描述符

文件描述符在形式上是一个很小的正整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。

详细介绍可以到wiki去了解…

其中的几个关键字需要注意: 正整数, 索引值,进程, 记录表.

那文件描述符和应用文件,系统内核又有什么联系呢? 还要标准输入,标准输出,标准错误呢? 它们和文件描述符又是什么关系呢?
好,我们一一来解释:
我们先引用一句话

当我们在s h e l l中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件。由于文件描述符不容易记忆, s h e l l同时也给出了相应的文件名。 下面就是这些文件描述符及它们通常所对应的文件名: 文件文件描述符 输入文件—标准输入0:它是命令的输入,缺省是键盘,也可以是文件或其他命令的输出。 输出文件—标准输出1:它是命令的输出,缺省是屏幕,也可以是文件。 错误输出文件—标准错误2:这是命令错误的输出,缺省是屏幕,同样也可以是文件。

OK, 我们知道了, 其实标准输入,标准输出,标准错误就是文件描述符,分别代表0,1,2, 记住以上的一句话 “每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件”, 例子:

打开一个shell, 那么标准输入 =》 键盘, 标准输出 =》終端, 錯誤輸出 =》 終端 (* 当然这些都是可以改变的)

奇怪? 键盘是文件? 为什么?

*nix的设计思想便是把一切设备都视作文件,那一切都可以解释了。

好,我们通过上面已经知道一个打开的进程占用了3个描述符(0,1,2), 记住每个进程都会默认打开, 那么最大文件描述符是多少呢? 它和我们写程序有什么关系么?什么时候这个描述符才会增加呢?我们来做一个例子
我们在console打开一个irb的进程,然后用这个进程打开一个文件,如图:

Picture 13

我们打开两次,然后用lsof 查看test.php这个文件情况,

COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
ruby    1557 weston    3r   REG   14,2        6 12966193 test.php
ruby    1557 weston    4r   REG   14,2        6 12966193 test.php

Picture 14

*其中的 FD表示文件描述符,3,4和我们推断的结果是一样的,但是为什么多了一个r呢? 详细的可以看这文章:http://blog.csdn.net/guoguo1980/archive/2008/04/24/2324454.aspx

通過以上,我們知道了,進程每打開一個文件,文件描述符就往上增加。 有了描述符,那麼系統就知道怎麼去哪裡操作這個文件了。

那文件描述符的最大值有什麼作用麼?
舉例:
如果一个Apache进程需要打开10000文件,但是系统规定一个进程最多能打开1000(文件描述符最大值为999)个,那是不是会出错呢? 怎么办? 看这篇文章:

http://blog.csdn.net/guoguo1980/archive/2008/04/26/2333001.aspx

转载请注明:韦旭红的点点滴滴 » 关于文件描述符(原创)