Unix 什么是文件描述符,用简单的术语解释?
与维基百科相比,对文件描述符的描述更简单的是什么?为什么需要它们?比如,以shell流程为例,它是如何应用的Unix 什么是文件描述符,用简单的术语解释?,unix,operating-system,file-descriptor,Unix,Operating System,File Descriptor,与维基百科相比,对文件描述符的描述更简单的是什么?为什么需要它们?比如,以shell流程为例,它是如何应用的 进程表是否包含多个文件描述符。若有,原因为何 简单地说,当您打开一个文件时,操作系统会创建一个条目来表示该文件并存储有关该打开文件的信息。所以,如果在您的操作系统中打开了100个文件,那么在操作系统中(内核中的某个地方)将有100个条目。这些条目由类似(…100、101、102…)的整数表示。此条目号是文件描述符。 所以它只是一个整数,唯一地表示操作系统中打开的文件。 如果您的流程打开1
简单地说,当您打开一个文件时,操作系统会创建一个条目来表示该文件并存储有关该打开文件的信息。所以,如果在您的操作系统中打开了100个文件,那么在操作系统中(内核中的某个地方)将有100个条目。这些条目由类似(…100、101、102…)的整数表示。此条目号是文件描述符。 所以它只是一个整数,唯一地表示操作系统中打开的文件。 如果您的流程打开10个文件,那么您的流程表将有10个文件描述符条目 类似地,当您打开一个网络套接字时,它也由一个整数表示,称为套接字描述符。
希望您能理解。文件描述符是一个不透明的句柄,在用户和内核空间之间的接口中用于标识文件/套接字资源。因此,当您使用
open()
或socket()
(系统调用内核接口)时,会给您一个文件描述符,它是一个整数(实际上是进程u结构的索引,但这并不重要)。因此,如果您想直接与内核接口,可以使用系统调用read()
,write()
,close()
等。您使用的句柄是文件描述符
系统调用上覆盖了一层抽象,即
stdio
接口。这提供了比基本系统调用更多的功能/特性。对于这个接口,您得到的不透明句柄是一个文件*
,它由fopen()
调用返回。有许多函数使用stdio
接口fprintf()
,fscanf()
,fclose()
,这些函数可以让您的生活更轻松。在C语言中,stdin
、stdout
和stderr
是FILE*
,它们在UNIX中分别映射到文件描述符0
、1
和2从马口中听到:APUE(Richard Stevens)。
对于内核,所有打开的文件都由文件描述符引用。文件描述符是一个非负数
当我们打开一个现有文件或创建一个新文件时,内核会向进程返回一个文件描述符。内核维护一个包含所有正在使用的打开文件描述符的表。文件描述符的分配通常是顺序的,它们作为自由文件描述符池中的下一个自由文件描述符分配给文件。当我们关闭文件时,文件描述符将被释放并可用于进一步分配。
有关更多详细信息,请参见此图:
当我们想要读取或写入文件时,我们用open()或create()函数调用返回的文件描述符标识该文件,并将其用作read()或write()的参数
按照惯例,UNIX系统shell将文件描述符0与进程的标准输入关联,将文件描述符1与标准输出关联,将文件描述符2与标准错误关联
文件描述符的范围从0到OPEN_MAX。可以使用ulimit-n
获得文件描述符的最大值。有关更多信息,请参阅APUE手册的第3章。作为其他答案的补充,unix将所有内容都视为文件系统。从内核的角度来看,键盘是一个只读文件。屏幕是一个只写文件。同样,文件夹、输入输出设备等也被视为文件。每当打开一个文件时,比如当设备驱动程序[用于设备文件]请求open()或进程打开一个用户文件时,内核都会分配一个文件描述符,一个整数,指定对该文件的访问,例如只读、只读等[供参考:任何操作系统都有进程(p)在运行,比如p1、p2、,p3等等。每个进程通常会持续使用文件
每个流程都由一个流程树(或另一个短语中的流程表)组成
通常,操作系统通过一个数字来表示每个进程中的每个文件(也就是说,在每个进程树/表中)
流程中使用的第一个文件是file0,第二个是file1,第三个是file2,依此类推
任何这样的数字都是文件描述符。
文件描述符通常是整数(0、1、2,而不是0.5、1.5、2.5)
鉴于我们通常将流程描述为“流程表”,并且鉴于表中有行(条目),我们可以说每个条目中的文件描述符单元用于表示整个条目
同样,当您打开一个网络套接字时,它有一个套接字描述符
在某些操作系统中,文件描述符可能会用完,但这种情况极为罕见,普通计算机用户不必为此担心
文件描述符可能是全局的(进程A开始于0,结束于1;进程B开始于2,结束于3)等等,但据我所知,通常在现代操作系统中,文件描述符不是全局的,实际上是特定于进程的(进程A以0开始,以5结束,而进程B以0开始,以10结束)。关于文件描述符的更多要点:
文件描述符
(FD)是与打开的文件关联的非负整数
0、1、2是标准的FD
#>sleep 1000 &
[12] 14726
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sleep 14726 root cwd DIR 8,1 4096 1201140 /home/x
sleep 14726 root rtd DIR 8,1 4096 2 /
sleep 14726 root txt REG 8,1 35000 786587 /bin/sleep
sleep 14726 root mem REG 8,1 11864720 1186503 /usr/lib/locale/locale-archive
sleep 14726 root mem REG 8,1 2030544 137184 /lib/x86_64-linux-gnu/libc-2.27.so
sleep 14726 root mem REG 8,1 170960 137156 /lib/x86_64-linux-gnu/ld-2.27.so
sleep 14726 root 0u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 1u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 2u CHR 136,6 0t0 9 /dev/pts/6
cwd – Current Working Directory
txt – Text file
mem – Memory mapped file
mmap – Memory mapped device
NUMBER – Represent the actual file descriptor.
REG – Regular File
DIR – Directory
FIFO – First In First Out
sleep 14726 root 0u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 1u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 2u CHR 136,6 0t0 9 /dev/pts/6