精华内容
下载资源
问答
  • 2018-09-02 11:26:36

    背景

    最近调试一款网关设备,它部署在客户端和服务端之间。在工作时,它同时接收来自客户端的连接,同时又向服务端建立连接。

    网关在完全接收来自客户端的数据后,会校验数据合法性,只有数据合法,网关才会向服务器建立连接并转发数据。

    这样,当存在一个客户端和服务端的通信时,网关有可能需要同时建立两个连接,占用两个fd。这对网关的数据处理能力提出了较高的要求。

    在调试中出现的现象是,当客户端以较多的并发的速率向网关建立连接时,网关会因为已经打开的fd过多而拒绝连接,导致来自客户端的连接建立失败。

    本文就对此现象进行了简略分析,同时复习一下linux下的文件描述符。

    系统中fd的限制

    linux系统中通常会对每个进程所能打开的文件数据有一个限制,当进程中已打开的文件描述符超过这个限制时,open()等获取文件描述符的系统调用都会返回失败。

    linux下最大文件描述符的限制有两个方面,一个是用户级的限制,另外一个则是系统级限制。

    • 用户级限制:ulimit命令看到的是用户级的最大文件描述符限制,也就是说每一个用户登录后执行的程序占用文件描述符的总数不能超过这个限制
    • 系统级限制:sysctl命令和proc文件系统中查看到的数值是一样的,这属于系统级限制,它是限制所有用户打开文件描述符的总和

    查看限制数量

    • 查看用户级限制:ulimit -n
    -> % ulimit -n
    1024
    • 系统级限制:
      • sysctl -a
      • cat /proc/sys/fs/file-max
    -> % sysctl -a | grep file-max
    sysctl: fs.file-max = 100262
    
    -> % cat /proc/sys/fs/file-max 
    100262

    修改限制数量

    • 修改用户级限制
      • 临时修改,只对当前shell有效:ulimit -HSn 65536
      • 永久修改:编辑/etc/security/limits.conf
    -> % ulimit -SHn 2048
    yao@yao-virtual-machine [10时49分18秒] [~/work/util] 
    -> % ulimit -n
    2048
    
    vi /etc/security/limits.conf
    * hard nofile 65536
    * soft nofile 65536
    • 修改系统级限制
      通过sysctl命令修改/etc/sysctl.conf文件:sysctl -w fs.file-max=2048,完成后执行sysctl -p即可

    文件描述符简述

    简述

    在Linux通用I/O模型中,I/O操作系列函数(系统调用)都是围绕一个叫做文件描述符的整数展开。

    I/O操作系统调用都以文件描述符(一个非负整数),指代打开的文件。每个进程都有一个打开文件表,可以理解成一个数组,文件描述符可以理解成数组的下标。

    相关I/O操作系统调用以文件描述符为参数,便可以通过数组访问定位到指定的文件对象,进而进行I/O操作。

    当某个程序打开文件时,操作系统返回相应的文件描述符,程序为了处理该文件必须引用此描述符。所谓的文件描述符是一个低级的正整数。最前面的三个文件描述符(0,1,2)分别与标准输入(stdin),标准输出(stdout)和标准错误(stderr)对应,如下表。

    文件描述符用途POSIX名称stdio流
    0标准输入STDIN_FILENOstdin
    1标准输出STDOUT_FILENOstdout
    2标准出错STDERR_FILENOstderr

    正常情况下,程序在开始运行之前,由shell准备好这3个文件描述符。更准确的说法是,程序继承了shell文件描述符的副本,一般是指向shell所在的终端。当然了,可以通过在shell中对输入/输出进行重定向或者在程序启动后关闭并重新打开文件描述符,修改文件描述符指向。

    在linux系统中,内核维护了三个数据结构,分别是进程级文件描述符表、系统级打开文件表和文件系统i-node表。

    文件描述符表

    内核为每个进程维护一个文件描述符表,该表每一条目都记录了单个文件描述符的相关信息,包括:

    • 控制标志(flags),目前内核仅定义了一个,即close-on-exec
    • 打开文件描述体指针

    打开文件表

    内核对所有打开的文件维护一个系统级别的打开文件描述表(open file description table),简称打开文件表。表中条目称为打开文件描述体(open file description),存储了与一个打开文件相关的全部信息,包括:

    • 文件偏移量(file offset),调用read()和write()更新,调用lseek()直接修改
    • 访问模式,由open()调用设置,例如:只读、只写或读写等
    • i-node对象指针

    i-node表

    每个文件系统会为存储于其上的所有文件(包括目录)维护一个i-node表,单个i-node包含以下信息:

    • 文件类型(file type),可以是常规文件、目录、套接字或FIFO
    • 访问权限
    • 文件锁列表(file locks)
    • 文件大小

    i-node存储在磁盘设备上,内核在内存中维护了一个副本,这里的i-node表为后者。副本除了原有信息,还包括:引用计数(从打开文件描述体)、所在设备号以及一些临时属性,例如文件锁。

    复制与关闭

    1. 文件描述符的复制和重定向非常简单,使用dup()系统调用即可完成。在shell中,使用>即可进行重定向。

      流程如下:

      • 打开目标文件,返回文件描述符n;
      • 关闭文件描述符1;
      • 调用dup将文件描述符n复制到1;
      • 关闭文件描述符n;
    2. 在程序中使用fork()创建子进程时,父进程中已经打开的fd也会自动在子进程中打开。子进程可以直接对这些文件进行操作。

      此时,需要分别在子进程和父进程中关闭fd。一般父进程创建子进程后,父进程会直接关闭掉fd,子进程处理完成后再关闭fd。

    3. 使用unix域套接字也可以进行文件描述符的传递,但从一个进程传递到另一个进程后,fd可能会发生变化。

      注意使用完毕后,分别关闭fd。

    更多相关内容
  • linux文件描述符最大限制默认最大为1024,通过 [root@localhost ~]# ulimit -n 1024 这个命令可以查看。此值可以修改。 进程的文件描述符,可以通过 [root@localhost ~]# ls -al /proc/13623/fd |wc -l 59 输出...
  • linux文件描述符总结

    2021-09-11 11:14:10
    当我们在Linux中打开一个文件的时候,都会创建一个文件描述符。每一个文件描述符都一定会有一个对应的“文件“”,但是,不同的文件描述符可能对应同一个文件。即文件描述符和文件的关系是n:1。 出现的必要性 我们...

    1.简介

    FD(file descriptor):文件描述符。一般指的是Linux中一个进程访问文件的唯一标识。

    当我们在Linux中打开一个文件的时候,都会创建一个文件描述符。
    每一个文件描述符的出现必然有一个对应的“文件”。
    不同的文件描述符可能对应同一个文件。即文件描述符和文件的关系是n:1。

    2. 出现的必要性

    我们都知道在Linux系统中,一切皆文件,或者用一种更加准确的说法应该是一切皆文件描述符。不管是操作文件,目录,亦或是操作端口,在Linux系统中都体现为是操作文件描述符。这种的好处是:

    1. 基于文件描述符的IO操作符合POSIX标准
    2. 在Linux或Unix系统中,大量的系统调用都是基于文件描述符的

    3. 创建FD的方法

    1. 进程直接open一个文件句柄,即会创建FD。在这种模式下FD:文件=1:1
    2. 从父进程继承一个文件句柄,会创建一个FD。这种情况的结果就是两个进程的两个FD指向同一个inode。当进程fork出一个子进程的时候,子进程会继承父进程所有的文件描述符的副本。在这种模式下FD:文件=n:1

    4. FD的存储方式

    系统会为每一个进程维护一个文件描述符表,所有的文件描述符都会在这个表里面创建一个索引
    系统为了存储FD,用了三张表:

    1. 进程级的文件描述符表;
    2. 系统级的打开文件描述符表;
    3. 文件系统的i-node表。
      在这里插入图片描述

    三张表的关系如上图所示,

    1. 文件描述符表示进程级别的,即每一个进程都会有一张维护其占用FD的表。在进程内部,FD标识即第一列是唯一的。第二列是保存了指向系统级的打开文件描述符表的指针
    2. 打开文件描述符表是系统级别的,即整个系统只会保留一份。每一个进程在创建FD之后,都会在这个表里面注册一下。所有的进程FD都可以在这里找到一条对应的记录。分为三列,第一列是FD的状态,即可读,可写还是读写。第二列是当前FD操作的文件索引到哪里了。第三列是一个指向node的指针。
    3. i-node表是文件系统级别的。我们都知道,i-node是存储文件实际元数据的地方,即文件长度等属性。这里分几种情况说明:
       当一个文件被打开一次时,那么其对应的node指针直接指向node位置
       当一个文件在不同的进程中被打开两次时,那么在文件描述符表和打开文件描述符表都是存储两条记录,但是因为是同一个文件,所以是指向一个node记录的。如上图中打开文件描述符表的第2,3条记录

    5. FD 名称(cwd,memory…\d[u|r|w])

    1. 当执行一个进程的时候,会有一个cwd的文件描述符。
      cwd指的是current work directory,即当前工作目录。
      为什么会有指定当前目录的FD呢?
      是因为在Linux系统中,不管是目录还是文件都是以文件的方式存在的。所以当我们执行一个进程的时候,需要指定在哪个目录中执行,系统会去打开指定的执行目录,那么这个过程也就是一个打开系统文件的过程,即会创建FD。所以可以理解为任何一个进程都会有cwd的FD
      在这里插入图片描述

    2. 当执行一个进程的时候,会有一个txt的文件描述符。
      txt可以理解为是程序代码,如应用程序的二进制库或者是共享库等。
      为什么会有txt的FD呢?
      既然是执行进程,那么必须有指定执行内容的代码文件。执行的时候需要读取文件内容,那么打开代码文件也必然会创建FD。所以可以理解为任何一个进程都会有txt的FD
      在这里插入图片描述

    3. 还有一些特殊的FD:

    1. rtd:根目录
    2. mem:内存映射文件
    3. mmap:内存映射设备

    在这里插入图片描述

    1. 还有一些FD是数值开头的,这些表示的是这个进程执行时需要打开的一些文件描述符,这个数值也可以理解为是打开该文件时返回的一个整数。当初始化打开每一个进程的时候,都会默认有三个数值开头的FD,即0,1,2。也可以当做是内置FD,因为他们默认代表了特殊的含义
    1. 0:stdout,标准输出
    2. 1:stdin,标准输入
    3. 2:stder,错误输出

    所以当应用程序内部打开文件的时候,数值都是从3开始的,有效范围是0-OPEN_MAX
    在数值的后面还会加一个FD读写权限的标识:

    1. u:读写
    2. r:只读
    3. w:只写

    在这里插入图片描述

    6.FD TYPE

    还有一个经常和FD一个使用的TYPE,即FD的type。

    1. REG :文件
    2. DIR:目录
    3. CHR :字符
    4. BLK:块设备
    5. UNIX:unix域套接字
    6. FIFO :先进先出队列
    7. IPv4:网际协议 (IP) 套接字

    7. 查看FD使用情况

    1. 当想要查看某一个进程的FD的使用情况的时候,需要先找到查看进程的id,可以通过ps 查看,比如现在查看clickhouse-client的FD使用情况
      在这里插入图片描述
      可以看到进程id是77575
    2. 查看该进程的最大FD数量
      cat /proc/77575/limits
      在这里插入图片描述
      找到这一行,可以看到可以支持的FD OPEN_MAX是1024,即最大可以支持1024个FD
    3. 查看使用的FD
      ll /proc/77575/fd | wc -l
      在这里插入图片描述
      可以看到已经使用的是7个
    展开全文
  • Linux文件描述符到底是什么?

    千次阅读 多人点赞 2019-04-21 15:19:19
    一个 Linux 进程可以打开成百上千个文件,为了表示和区分已经打开的文件,Linux 会给每个文件分配一个编号(一个 ID),这个编号就是一个整数,被称为文件描述符(File Descriptor)。这只是一个形象的比喻,为了让...

    Linux 中一切皆文件,比如 C++ 源文件、视频文件、Shell脚本、可执行文件等,就连键盘、显示器、鼠标等硬件设备也都是文件。一个 Linux 进程可以打开成百上千个文件,为了表示和区分已经打开的文件,Linux 会给每个文件分配一个编号(一个 ID),这个编号就是一个整数,被称为文件描述符(File Descriptor)
    这只是一个形象的比喻,为了让读者容易理解我才这么说。如果你也仅仅理解到这个层面,那不过是浅尝辄止而已,并没有看到文件描述符的本质。
    本篇文章的目的就是拨云见雾,从底层实现的角度来给大家剖析一下文件描述符,看看文件描述如到底是如何表示一个文件的。
    不过,阅读本篇文章需要你有C语言编程基础,至少要理解数组、指针和结构体;如果理解内存,那就更好了,看了这篇文章你会醍醐灌顶。
    好了,废话不多说,让我们马上进入正题吧。

    Linux 文件描述符到底是什么?

    一个 Linux 进程启动后,会在内核空间中创建一个 PCB 控制块,PCB 内部有一个文件描述符表(File descriptor table),记录着当前进程所有可用的文件描述符,也即当前进程所有打开的文件。

    内核空间是虚拟地址空间的一部分,想死磕的读者请猛击《C语言内存精讲》,不想纠缠细节的读者可以这样理解:进程启动后要占用内存,其中一部分内存分配给了文件描述符表。除了文件描述符表,系统还需要维护另外两张表:

    打开文件表(Open file table

    i-node 表(i-node table
    文件描述符表每个进程都有一个,打开文件表和 i-node 表整个系统只有一个,它们三者之间的关系如下图所示。

    从本质上讲,这三种表都是结构体数组,0、1、2、73、1976 等都是数组下标。表头只是我自己添加的注释,数组本身是没有的。实线箭头表示指针的指向,虚线箭头是我自己添加的注释。

    你看,文件描述符只不过是一个数组下标吗!

    通过文件描述符,可以找到文件指针,从而进入打开文件表。该表存储了以下信息:

    • 文件偏移量,也就是文件内部指针偏移量。调用 read() 或者 write() 函数时,文件偏移量会自动更新,当然也可以使用 lseek() 直接修改。
    • 状态标志,比如只读模式、读写模式、追加模式、覆盖模式等。
    • i-node 表指针。


    然而,要想真正读写文件,还得通过打开文件表的 i-node 指针进入 i-node 表,该表包含了诸如以下的信息:

    • 文件类型,例如常规文件、套接字或 FIFO。
    • 文件大小。
    • 时间戳,比如创建时间、更新时间。
    • 文件锁。

    从本质上讲,这三种表都是结构体数组,0、1、2、73、1976 等都是数组下标。表头只是我自己添加的注释,数组本身是没有的。实线箭头表示指针的指向,虚线箭头是我自己添加的注释。

    你看,文件描述符只不过是一个数组下标吗!

    通过文件描述符,可以找到文件指针,从而进入打开文件表。该表存储了以下信息:

    • 文件偏移量,也就是文件内部指针偏移量。调用 read() 或者 write() 函数时,文件偏移量会自动更新,当然也可以使用 lseek() 直接修改。
    • 状态标志,比如只读模式、读写模式、追加模式、覆盖模式等。
    • i-node 表指针。


    然而,要想真正读写文件,还得通过打开文件表的 i-node 指针进入 i-node 表,该表包含了诸如以下的信息:

    • 文件类型,例如常规文件、套接字或 FIFO。
    • 文件大小。
    • 时间戳,比如创建时间、更新时间。
    • 文件锁。


    对上图的进一步说明:

    • 在进程 A 中,文件描述符 1 和 20 都指向了同一个打开文件表项,标号为 23(指向了打开文件表中下标为 23 的数组元素),这可能是通过调用 dup()、dup2()、fcntl() 或者对同一个文件多次调用了 open() 函数形成的。
    • 进程 A 的文件描述符 2 和进程 B 的文件描述符 2 都指向了同一个文件,这可能是在调用 fork() 后出现的(即进程 A、B 是父子进程关系),或者是不同的进程独自去调用 open() 函数打开了同一个文件,此时进程内部的描述符正好分配到与其他进程打开该文件的描述符一样。
    • 进程 A 的描述符 0 和进程 B 的描述符 3 分别指向不同的打开文件表项,但这些表项均指向 i-node 表的同一个条目(标号为 1976);换言之,它们指向了同一个文件。发生这种情况是因为每个进程各自对同一个文件发起了 open() 调用。同一个进程两次打开同一个文件,也会发生类似情况。 


    有了以上对文件描述符的认知,我们很容易理解以下情形:

    • 同一个进程的不同文件描述符可以指向同一个文件;
    • 不同进程可以拥有相同的文件描述符;
    • 不同进程的同一个文件描述符可以指向不同的文件(一般也是这样,除了 0、1、2 这三个特殊的文件);
    • 不同进程的不同文件描述符也可以指向同一个文件。

    文章来源:https://mp.csdn.net/postedit

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    •  

     

     

    展开全文
  • linux中,有时候我们只知道文件描述符却不知道它的名字及其完整的路径,如果我们想获取其路径该怎么办呢?其实很简单,在linux中每个被打开的文件都会在/proc/self/fd/目录中有记录,其中(/proc/self/fd/文件描述...
  • linux系统文件描述符详解

    千次阅读 2021-09-29 16:16:13
    首先我们需要知道操作系统内维护了三个系统文件表:文件描述符表(file descriptor table),打开文件表(open file table),inode table。这三个表的结构见Table-1 我们知道在like-unix系统中所有的IO操作(包括...

    首先我们需要知道操作系统内维护了三个系统文件表:文件描述符表(file descriptor table),打开文件表(open file table),inode table。这三个表的结构见Table-1

    我们知道在like-unix系统中所有的IO操作(包括socket等)都是基于文件描述符的。程序刚刚启动的时候已经默认帮我们分配了三个文件描述符,就是我们常用的0标准输入,1标准输出,2标准错误。如果此时进程再打开新的文件,它的文件描述符会加1也就是3。POSIX标准要求每次打开文件时(含socket)必须使用当前进程中最小可用的文件描述符号。

    Table-1

     文件描述符表(file descriptor table)

    每一个进程维护了一份自己的文件描述符表,该表中的每条记录维护了该条文件描述符的相关信息,包括:

    • 控制标志(fd flags), 截至目前,内核仅定义了一个flag,close-on-exec
    • open file ptr : 指向open file table的指针

    打开文件表(open file table)

    内核内维护的一个系统范围的打开文件表。该表中包含每一个打开的文件条目,文件表项跟踪所有对文件的读或写操作当前偏移量和文件的打开模式(O_RDONLYO_WRONLY, or O_RDWR)。

    该表中的每条记录维护了与一个打开的文件相关的全部信息,包括:

    • 文件偏移量(file offset):调用read()或者write()操作更新,调用fseek()直接修改,流类型的文件(比如pipes 和 sockets)不能使用偏移量,因为文件中的数据不是随机访问的。
    • 访问模式(status flags):只读,只写或读写等
    • inode指针:指向inode表元素的指针,关联物理文件
    • 引用计数:比如一条记录被2个文件描述符引用,计数就为2

    inode表

    在linux系统中使用inode号描述文件,就像进程使用pid描述进程一样。inode存储了文件的元信息。系统上的所有文件都分配了一个inode记录。

    每个inode记录包含以下信息(可以使用stat命令查看):

    $ stat a
      File: a
      Size: 4         	Blocks: 8          IO Block: 4096   regular file
    Device: 805h/2053d	Inode: 1446030     Links: 1
    Access: (0664/-rw-rw-r--)  Uid: ( 1000/zhangboqi)   Gid: ( 1000/zhangboqi)
    Access: 2021-09-29 14:35:32.344894535 +0800
    Modify: 2021-09-29 14:35:32.344894535 +0800
    Change: 2021-09-29 14:35:32.344894535 +0800
     Birth: -
    • 文件的字节数(Size):
    • Blocks: 文件占用块大小,单位512字节,就是文件实际占用大小
    • IO Block: 文件系统每次IO操作的最小大小,ext4默认是4096字节
    • 文件类型:如,常规文件(regular file),目录,套接字或FIFO等
    • 设备号(Device):设备号
    • inode号(Inode):文件对应的inode号
    • 硬链接数(Links):即有多少个文件指向这个inode
    • 文件权限(Access)
    • 文件uid和gid:
    • 文件的时间戳:Access为文件上一次打开的时间,Modify为文件上一次修改的时间,Change为inode上一次变动的时间

    注:inode存储在磁盘设备上,但内核会在内存中维护一份。这里的inode table就是指内存中的副本。inode table中的记录同样维护了一个引用计数,该记录每被open file记录引用一次就加1。

    文件描述符数量限制

    进程可用的文件描述符的数量由sys/limits.h文件中的/OPEN_MAX控制。文件描述符的数量也可由ulimit -n控制。可以分配给进程的文件描述符的数量由资源限制控制。默认值是在/etc/security/limits文件中设置的,通常设置为2000。可以通过ulimit命令或setrlimit子例程更改该限制。最大大小由常量OPEN_MAX定义。

    文件描述符的创建

    open, pipe, createfcntl子程序都可以创建文件描述符。文件描述符在每个进程里都是唯一的,但是他们可以有fork子程序创建的子进程共享。也可以由fcntldupdup2子程序复制。

    文件描述符是一个存储在内核为每个进程维护的u_block区域中的文件描述符表的索引。进程获取文件描述符的最常见方法是通过opencreate操作,或者从父进程继承。当一个fork操作发生时。系统为子进程复制父进程的文件描述符表,它允许子进程平等地访问父进程使用的文件。

    管理文件描述符

    因为文件是可以同时被多个用户共享的,所以有必要允许相关进程共享一个公共偏移指针,并且访问同一文件的独立进程拥有一个单独的当前偏移指针,open file table 条目维护了一个引用计数,用来跟踪分配给文件的文件描述符的数量。

    对单个文件的多个引用可能是由下列任何一种情况引起的:

    • 打开文件的单独进程
    • 子进程保留分配给父进程的文件描述符
    • fcntl或dup子例程创建一个文件描述符的副本

    共享打开文件

    每个打开操作创建一个系统打开文件表项。单独的表项确保每个进程有单独的当前I/O偏移量。独立偏移量可以保护数据的完整性。当一个文件描述符被复制时,两个进程将共享相同的偏移量,并可能发生交错,在这种情况下,字节不是按顺序读或写的。

    复制文件描述符

    文件描述符可以通过以下方式在进程之间复制:dupdup2子例程、fork子例程和fcntl(文件描述符控制)子例程。

    dup和dup2子程序

    dup子例程创建一个文件描述符的副本。副本是在包含原始描述符的用户文件描述符表中的空白位置创建的。dup进程将open file table项中的引用计数加1,并返回副本所在的文件描述符的索引号。

    fork子程序

    fork子例程创建一个子进程,子进程继承分配给父进程的文件描述符。然后子进程执行一个新进程。当fcntl子程序关闭时继承的文件描述符会设置close-on-exec标志

    FCNTL(文件描述符控制)子程序

    fcntl子例程操作文件结构并控制打开的文件描述符。它可以用来对描述符进行以下更改:

    • 复制一个文件描述符(与dup子例程相同)。
    • 获得或设置“close-on-exec ”标志。
    • 为描述符设置非阻塞模式。
    • Append future writes to the end of the file(O_APPEND).
    • 当可以进行I/O时,允许向进程生成信号。
    • Set or get the process ID or the group process ID for SIGIO handling.
    • 关闭所有文件描述符。

    预设文件描述符值

    当shell运行一个程序时,它会打开三个文件,其中包含文件描述符0、1和2。这些描述符的默认赋值如下:

    Descriptor

    Explanation

    0Represents standard input.
    1Represents standard output.
    2Represents standard error.

    这些默认的文件描述符连接到终端,因此,如果程序读取文件描述符0并写入文件描述符1和2,则程序从终端收集输入并将输出发送到终端。当程序使用其他文件时,文件描述符按升序分配。

    如果使用<(小于)或>(大于)符号重定向I/O,则shell的默认文件描述符分配将被更改。例如,以下命令将文件描述符0和1的默认赋值从终端更改为适当的文件:

    prog < FileX > FileY

    在这个例子中,文件描述符0现在指的是FileX,文件描述符1指的是FileY。文件描述符2没有被更改。程序不需要知道它的输入来自哪里,也不需要知道它被发送到哪里,只要文件描述符0表示输入文件,1和2表示输出文件。

    下面的示例程序演示了标准输出的重定向:

    #include <fcntl.h>
    #include <stdio.h>
    
    void redirect_stdout(char *);
    
    main()
    {
           printf("Hello world\n");       /*this printf goes to
                                          * standard output*/
           fflush(stdout);
           redirect_stdout("foo");        /*redirect standard output*/
           printf("Hello to you too, foo\n");
                                          /*printf goes to file foo */
           fflush(stdout);
    }
    
    void
    redirect_stdout(char *filename)
    {
            int fd;
            if ((fd = open(filename,O_CREAT|O_WRONLY,0666)) < 0)
                                            /*open a new file */
            {
                    perror(filename);
                    exit(1);
            }
            close(1);                       /*close old */
                                            *standard output*/
            if (dup(fd) !=1)                /*dup new fd to
                                            *standard input*/
            {
                    fprintf(stderr,"Unexpected dup failure\n");
                    exit(1);
            }
            close(fd);                       /*close original, new fd,*/
                                             * no longer needed*/
    }

    在文件描述符表中,文件描述符编号被分配到请求描述符时可用的最低描述符编号。但是,可以使用dup子例程在文件描述符表中分配任何值。

    展开全文
  • linux文件描述符的查看及分析

    千次阅读 2021-05-11 19:48:48
    起因近期在调试一个Android播放内核是遇到上层传递的是fd(file descriptor),但是在文件播放结束之后调用lseek却提示返回-1,errno=29(#define ESPIPE 29 /* Illegal seek */)。好吧。那就确定下原因。在网上搜到有...
  • Linux 文件描述符

    千次阅读 2018-09-06 13:57:26
    Linux当中的文件 Linux内核将一切视为文件,那么Linux中文件是什么呢? 其既可以是事实上的真正的物理文件,也可以是设备,管道,甚至可以是一块内存, ...文件描述符 对于linux而言,所有对...
  • linux文件描述符

    千次阅读 2019-10-08 10:20:32
    所有执行I/O操作的系统调用都以文件描述符,即一个非负整数来指代所打开的文件。文件描述符可以用来表示所有类型的已打开文件。同时,多个文件描述符可以指向同一个打开文件,因为有在不同进程中打开同一个文件的...
  • linux文件描述符限制和单机最大长连接数相关参数linux系统中与文件描述符相关的参数有以下几个: soft/hard nofile file-max(/proc/sys/fs/file-max) nr_open(/proc/sys/fs/nr_open) 这三个参数的作用都是限制一...
  • 主要介绍了Linux文件描述符fd与文件指针FILE*互相转换实例解析,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
  • Linux 文件描述符(fd)

    千次阅读 2021-11-09 09:55:31
    Linux 系统中把一切都看做是文件,当进程打开现有文件或创建新文件时,内核向进程返回一个文件描述符文件描述符就是内核为了高效管理已被打开的文件所创建的索引,用来指向被打开的文件,所有执行 I/O 操作的系统...
  • Linux 文件描述符最大数值 查看操作系统文件描述符最大数值: $ cat /proc/sys/fs/file-max 查看登录shell文件描述符最大数值: ulimit−Hn硬资源限制(hardlimit) ulimit -Hn 硬资源限制 (hard limit) ulimit -n...
  • Linux操作系统都是基于文件概念的,文件是以字符序列构成的信息载体。根据这一点,可以把I/O设备当做文件来处理。因此,与磁盘上的普通文件进行交互所用的同一...这里用到了一个重要的概念——文件描述符。对于Linux...
  • linux文件描述符和套接字的问题

    千次阅读 2016-05-03 10:34:40
    记得刚学linux的时候 就会听到一句"一切皆文件" 上面标准输入 标准输出 标准错误 重定向 blablabla... 今天在写一个基于epoll的聊天室 客户端fork 父进程负责读 子进程负责写 感觉这好像服务端 主从备份..还像nginx...
  • Linux 文件描述符与重定向

    千次阅读 2022-04-06 12:40:11
    1.什么是文件描述符 文件描述就是打开文件内核数据结构,返回给用户的一个整数。 #include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/stat.h> #include<...
  • Linux 文件描述符详解

    万次阅读 多人点赞 2016-04-14 12:43:54
    Overview了解Linux怎样处理输入和输出是非常重要的。...Linux标准文件描述符 文件描述符 缩写 描述 0 STDIN 标准输入 1 STDOUT 标准输出 2 STDERR 标准错误输出 Linux系统将所有设备都当作文件
  • Linux】浅谈文件描述符和重定向

    千次阅读 多人点赞 2022-02-26 22:00:08
    浅谈文件描述符和重定向
  • 1. 查看系统当前使用的文件描述符个数 root@imx6qsabresd:~# cat /proc/sys/fs/file-nr 864 0 69474 //第一列1216:为已分配的FD数量 //第二列0:为已分配但尚未使用的FD数量 //第三列197787:为系统可用的最大...
  • Linux文件描述符

    千次阅读 2018-08-02 17:18:05
    Linux通用I/O模型中,I/O操作系列函数(系统调用)都是围绕一个叫做文件描述符的整数展开。这不禁让人产生疑问:这个整数代表什么?一个数值代表一个文件吗?随便传一个整数进去调用可以吗? 解答以上疑问,需要更...
  • Linux中进程间传递文件描述符的方法

    千次阅读 2020-10-12 20:08:21
    Linux中,虽然文件描述符是一个整型值,但是它的传递并非只是传递这个值而已。因为这个整型值其实是文件描述符表fd_array[]的下标 由于不同进程的文件描述符表不同,所以要传递一个文件描述符,就是要在接收进程...
  • Linux 文件描述符问题

    千次阅读 2014-06-14 01:08:12
    昨天解了个bug,关于文件描述符的,这种问题很久之前也遇到过,这次再犯真的不该。 问题是这样的。 fopen()打开一个文件,...1.linux打开文件描述符的最大个数为1024,根据这次发现, 2.这是针对于单独进程的,
  • linux文件描述符

    千次阅读 2018-11-23 17:34:51
    写在前面,linux的描述符有进程描述符、文件描述符、内存描述符。首先标题想了很久linux的描述符从哪里说起,看了几份资料后还是决定从进程描述符说起。但是此文章还是重点说的是文件描述符。知识深度有限,如有错误...
  • linux修改进程最大文件描述符

    千次阅读 2022-03-11 14:28:24
    文件描述符分为系统级、用户级、进程级,以下演示如何修改进程最大文件描述符 查看某个进程的最大文件描述符数 cat /proc/{pid}/limits 可以看到 “MAX open files”为100002,这里因为之前修改过,一般进程默认文件...
  • 彻底弄懂 Linux 下的文件描述符(fd)

    万次阅读 多人点赞 2020-08-14 17:01:52
    Linux文件描述符(fd)
  • Linux 系统文件描述符(fd)

    万次阅读 2021-11-06 11:25:14
    Linux 系统中把一切都看做是文件,当进程打开现有文件或创建新文件时,内核向进程返回一个文件描述符文件描述符就是内核为了高效管理已被打开的文件所创建的索引,用来指向被打开的文件,所有执行 I/O 操作的系统...
  • 在学习《深入理解计算机系统》10.8节"共享文件"的时候有点困惑,查阅了一些资料后做一下总结;附带了两道书上的练习题,并对父子进程的程序执行流程画了简单的示意图
  • 查看受计算机硬件限制的文件描述符上限 cat/vim /proc/sys/fs/file-max 通过配置文件修改文件上限值 vim /etc/security/limits.conf 在文件末尾添加两行如下代码,将文件上限值设为8000,该值不能超过步骤1得到的受...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 252,936
精华内容 101,174
关键字:

linux文件描述符

友情链接: SpreadCommon.rar