|
发表于 2004-4-25 09:09:09
|
显示全部楼层
准确地说,文件描述符是进程资源中一个重要的组成部分,它用整数来表示(不是指针)。linux的进程在创建时,默认会打开3个文件描述符0,1和2,分别对应标准输入stdin,标准输出stdout和标准错误输出stderr。标准输入一般都是键盘,标准输出和标准错误输出一般指的是屏幕。要注意的是,文件描述符对应的是打开的文件,而不是/dev目录下的设备文件。如果用open("kk",O_RDONLY)打开一个磁盘上名为“kk"的文件,如果进程创建后没有打开其它文件,则这个打开的文件所对应的文件描述符应该按顺序是3。以后每次打开一个新的文件,文件描述符依次就是4,5,6,7.。。。这样按顺序递增。现在的linux内核能够支持一个linux的进程打开最多1024个文件(以前是256个)。应该说是很强了。
由于文件描述符只是代表一个打开的文件,具体打开的是什么文件与文件描述符是没有关系的,并且文件描述符所代表的文件是可以动态变更的,就象教室里面的座位一样,有人座在那儿,表示这个位置已经有人了,如果以前座在那儿的人走了,换了一个人座在那儿,这个位置还是被占用了,但座在位置上的人变了。文件描述符就好象这个座位的座位号,而文件描述符所代表的文件就相当于座在座位上的人。座位号不变,但人是可以变的,这一点可以用来进行重定向。比如说在shell下执行ls * > tt。ls作为一个进程,它的标准输出文件描述符1缺省应该是代表屏幕。但是在重定向后,它的标准输出,也就是文件描述符1所代表的文件就不是屏幕了,而是变成了打开的文件tt。这样,ls命令的输出结果就不会显示在屏幕上,而是写入到文件tt中。
在创建子进程时,父进程打开的文件描述符可以被子进程继承。 |
|