linux 中的文件描述符

文件描述符

file descriptor,简称FD ,用于指代被打开的文件,用一个非负的整数表示

对文件描述符的误区

每个程序启动的时候,都会打开3个文件,分别是,0标准输入,1标准输出,2标准错误,此后再打开文件的文件描述符就是3,依次类推。之前的误区是,当在进程中打开一个文件,它的文件描述符应该已经很大了,不应该是3,因为系统本身已经运行了很多程序。正确的应该是:进程只能看到自己的文件描述符,每个进程的文件描述符的编号都是从0开始,进程启动,默认都会打开标准输入,标准输出,标准错误这三个文件,之后再打开的文件的描述符从编号3开始

文件件描述符列表

每个进程都有着自己的文件描述符列表。进程A启动后,拥有stdin,stdout,stderr这三个文件描述符 ,再打开一个文件,这个文件的文件描述符就是3。进程B启动后,拥有stdin,stdout,stderr这三个文件描述符,再打一个文件,它的文件描述符也是3,和进程A的一样。所以,不同进程,可以拥有相同的文件描述符。

当一个文件在同一个进程中,被打开多次,那么这个文件具有不同的文件描述符,在同一个进程中,每个文件描述符只能对应一个文件。同一个进程,不同文件描述符可以指向同一个文件。

不同进程,如果都打开了同一个文件(文件描述符都指向同一个文件),那么它们都具有这个文件的句柄,其中一个进程对文件的修改,对其它进程是可见的。比如进程A对文件写入了10个字节,进程B在对文件进行写入时,是从第11个字节处开始写入的,而不是从文件头开始写入,这些操作包括read(),write(),seek()

文件描述符限制

内核为了不让某个进程消耗掉所有的文件资源,会对单个进程最大打开文件数做默认值处理(称之为用户级限制),默认值一般是1024。注意:同一个文件,可以有多个文件句柄,这可能是不同进程打开了同一个文件,或者是同一个进程内,对一个文件打开了多次