Linux编程--文件描述符fd,Linux命令ulimit

  linux中, 每一个进程在内核中,都对应有一个“打开文件”数组,存放指向文件对象的指针,而 fd 是这个数组的下标。

    我们对文件进行操作时,系统调用,将fd传入内核,内核通过fd找到文件,对文件进行操作。

    既然是数组下标,fd的类型为int, < 0 为非法值, >=0 为合法值。在linux中,一个进程默认可以打开的文件数为1024个,fd的范围为0~1023。可以通过设置,改变最大值。

    在linux中,值为0、1、2的fd,分别代表标准输入、标准输出、标准错误输出。在上一篇文章中,使用重定向 2>/dev/null 就是把标准错误输出重定向到位桶中去,不显示出来。因为 0 1 2已经被linux使用了,通常在程序中打开的fd,是从3开始的。但我们在判断一个fd是否合法时,依然要使用>=0的判断标准。

    fd的分配原则,是从小到大,找到第一个不用的进行分配。

    除了open之外, socket编程的socket()/accept()等函数,也会返回一个fd值。

 

    1)Linux系统下,所有进程允许打开的最大fd数量。查询语句:

        /proc/sys/fs/file-max
    2)Linux系统下,所有进程已经打开的fd数量及允许的最大数量。查询语句:

        /proc/sys/fs/file-nr
    3)单个进程允许打开的最大fd数量.查询语句:

        ulimit -n
    4)单个进程(例如进程id为5454)已经打开的fd.查询语句:

        ls -l /proc/5454/fd/

Linux命令ulimit

通过命令查询官方的简要解释如下:man ulimit

ulimit [-HSTabcdefilmnpqrstuvx [limit]]

在允许 shell 和由它启动的进程的系统上提供对可用资源的控制。-H 和 -S 选项指定为给定资源设置硬限制或软限制。硬限制一旦设置,非root用户就无法增加;软限制可以增加到硬限制的值。如果未指定 -H 和 -S,则同时设置软限制和硬限制。limit 的值可以是为资源指定的单位中的数字,也可以是特殊值"硬"、"软"或"无限"之一,它们分别代表当前硬限制、当前软限制和无限制。如果省略限制,则打印资源软限制的当前值,除非给出了 -H 选项。指定多个资源时,限制名称和单位将打印在值之前。其他选项的解释如下:

  • -a:报告所有电流限制
  • -b:最大套接字缓冲区大小
  • -c:创建的核心文件的最大大小
  • -d:进程数据段的最大大小
  • -e:最大调度优先级("nice")
  • -f:shell 及其子级写入的文件的最大大小
  • -i:挂起信号的最大数量
  • -l:可能锁定到内存中的最大大小
  • -m:最大驻留集大小(许多系统不遵守此限制)
  • -n:打开的文件描述符的最大数量(大多数系统不允许设置此值)
  • -p:以 512 字节块为单位的管道大小(可能未设置)
  • -q:POSIX 消息队列中的最大字节数
  • -r:最大实时调度优先级
  • -s:最大堆栈大小
  • -t:最大 CPU 时间量(以秒为单位)
  • -u:单个用户可使用的最大进程数
  • -v:可用于 shell 的最大虚拟内存量
  • -x:文件锁定的最大数量
  • -T:最大线程数

如果给出了限制,则它是指定资源的新值(仅显示 -a 选项)。如果未给出任何选项,则假定为 -f。值以 1024 字节为增量,但 -t(以秒为单位)、-p(以 512 字节块为单位)和 -T、-b、-n 和 -u(未缩放)除外。返回状态为 0,除非提供了无效的选项或参数,或者在设置新限制时发生错误。

简要说明如下:

  • 进行资源控制的对象?当前的shell以及其下启动的process;
  • 什么时候生效?设置之后,当前shell就生效了,重启即失效;ulimit -n 1024

通过命令,即可查看当前shell及其下启动的process所允许占用资源的上限,例如:ulimit -a

  1. [dev@cib69 elasticsearch-1.4.4]$ ulimit -a
  2. core file size (blocks, -c) 0
  3. data seg size (kbytes, -d) unlimited
  4. scheduling priority (-e) 0
  5. file size (blocks, -f) unlimited
  6. pending signals (-i) 514940
  7. max locked memory (kbytes, -l) 64
  8. max memory size (kbytes, -m) unlimited
  9. open files (-n) 2048
  10. pipe size (512 bytes, -p) 8
  11. POSIX message queues (bytes, -q) 819200
  12. real-time priority (-r) 0
  13. stack size (kbytes, -s) 10240
  14. cpu time (seconds, -t) unlimited
  15. max user processes (-u) 1024
  16. virtual memory (kbytes, -v) unlimited
  17. file locks (-x) unlimited

上述使用方式设置的参数,只对当前shell生效,重启之后失效,有没有永久生效的配置?有,文件。文件的样例如下:ulimit -n 1024/etc/security/limits.conf

  1. # /etc/security/limits.conf
  2. #
  3. #Each line describes a limit for a user in the form:
  4. #
  5. #<domain> <type> <item> <value>
  6. #
  7. #Where:
  8. #<domain> can be:
  9. # - an user name
  10. # - a group name, with @group syntax
  11. # - the wildcard *, for default entry
  12. # - the wildcard %, can be also used with %group syntax,
  13. # for maxlogin limit
  14. #
  15. #<type> can have the two values:
  16. # - "soft" for enforcing the soft limits
  17. # - "hard" for enforcing hard limits
  18. #
  19. #<item> can be one of the following:
  20. # - core - limits the core file size (KB)
  21. # - data - max data size (KB)
  22. # - fsize - maximum filesize (KB)
  23. # - memlock - max locked-in-memory address space (KB)
  24. # - nofile - max number of open files
  25. # - rss - max resident set size (KB)
  26. # - stack - max stack size (KB)
  27. # - cpu - max CPU time (MIN)
  28. # - nproc - max number of processes
  29. # - as - address space limit (KB)
  30. # - maxlogins - max number of logins for this user
  31. # - maxsyslogins - max number of logins on the system
  32. # - priority - the priority to run user process with
  33. # - locks - max number of file locks the user can hold
  34. # - sigpending - max number of pending signals
  35. # - msgqueue - max memory used by POSIX message queues (bytes)
  36. # - nice - max nice priority allowed to raise to values: [-20, 19]
  37. # - rtprio - max realtime priority
  38. #
  39. #<domain> <type> <item> <value>
  40. #
  41. #* soft core 0
  42. #* hard rss 10000
  43. #@student hard nproc 20
  44. #@faculty soft nproc 20
  45. #@faculty hard nproc 50
  46. #ftp hard nproc 0
  47. #@student - maxlogins 4
  48. # End of file

举例,设置用户允许用户dev同时打开文件个数为64000,则,在文件中添加如下配置即可:/etc/security/limits.conf

  1. dev soft nofile 64000
  2. dev hard nofile 64000

 

posted @ 2021-01-19 10:28  CharyGao  阅读(979)  评论(0编辑  收藏  举报