Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 什么是文件描述符,用简单的术语解释?_Unix_Operating System_File Descriptor - Fatal编程技术网

Unix 什么是文件描述符,用简单的术语解释?

Unix 什么是文件描述符,用简单的术语解释?,unix,operating-system,file-descriptor,Unix,Operating System,File Descriptor,与维基百科相比,对文件描述符的描述更简单的是什么?为什么需要它们?比如,以shell流程为例,它是如何应用的 进程表是否包含多个文件描述符。若有,原因为何 简单地说,当您打开一个文件时,操作系统会创建一个条目来表示该文件并存储有关该打开文件的信息。所以,如果在您的操作系统中打开了100个文件,那么在操作系统中(内核中的某个地方)将有100个条目。这些条目由类似(…100、101、102…)的整数表示。此条目号是文件描述符。 所以它只是一个整数,唯一地表示操作系统中打开的文件。 如果您的流程打开1

与维基百科相比,对文件描述符的描述更简单的是什么?为什么需要它们?比如,以shell流程为例,它是如何应用的

  • 进程表是否包含多个文件描述符。若有,原因为何


  • 简单地说,当您打开一个文件时,操作系统会创建一个条目来表示该文件并存储有关该打开文件的信息。所以,如果在您的操作系统中打开了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