`
wangqinghan
  • 浏览: 3655 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

FD文件描述符

阅读更多
一:文件描述符概念
  元数据(记录文件的大小,拥有者,所属组,大小,修改日期等)到文件的映射。当应用程序打开某个文件时,内核就会返回唯一的文件描述符给应用程序,应用程序通过文件描述符来引用文件。
   linux系统对每个用户,进程,整个系统能打开的文件描述符是有限制的,默认值是1024.当我们在系统或应用日志中碰到“too many open file”时,并不是整个系统打开太多的文件,而是某个用户,进程或系统打开的文件描述符已经达到限制。这个时候可以增加文件描述符的数量限制来解决这个问题。
二:常用关于文件描述符的相关命令lsof
   2.1 安装lsof
在Centos6中没有lsof命令,这时可以通过yum install lsof命令来安装lsof工具
   2.2 获取系统打开的文件描述符数量 cat /proc/sys/fs/file-nr
   cat /proc/sys/fs/file-nr
    2080 0 387517
   //第一列 2080 :已分配的FD数量
   //第二列 0    :已分配未使用的FD数量
   //第三列 387517:系统可用的最大的FD数量

备注:/proc目录是运行时访问内核数据结构,改变内核内置的机制,为访问系统内核提供接口。存储在内存当中。
    2.3 获取进程打开的文件描述符数量 以vi程序为例
     2.3.1 pidof vi
      12874
      //第一列 12874 vi程序的进程号
     2.3.2 ls -l /proc/12874/fd
      total 0
    lrwx------ 1 root root 64 Jun  2 14:28 0 -> /dev/pts/1
    lrwx------ 1 root root 64 Jun  2 14:28 1 -> /dev/pts/1
    lrwx------ 1 root root 64 Jun  2 14:00 2 -> /dev/pts/1
    lrwx------ 1 root root 64 Jun  2 14:28 4 -> /tmp/.2.txt.swp
     //显示vi程序用了4个文件描述符FD
  备注:pidof找出正在运行程序的进程号
     2.4 更改文件描述符限制
  当在系统或应用日志中碰到"too many open files"时,需要增加文件描述符的数量限制来解决此问题。在实际应用中,系统的默认文件描述符比较大,所以一般只需要更改用户和进程的文件描述符FD两者的限制数量
     2.4.1首先查看shell启动进程时,各个限制资源 ulimit -a 或ulimit -n
     [root@bdi23 ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 30516
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 30516
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

     备注:  ulimit -a用于显示shell资源的限制,图中红色的为文件描述符的限制数量

   [root@bdi23 ~]# ulimit -n
   1024
     备注:ulimit -n 用于显示用户或进程的FD文件描述符限制
    2.4.2更改FD文件描述符限制
       2.4.2.1临时更改FD文件描述符限制
     也就是说只在当前会话中更改FD文件描述符限制,退出重新登录后,系统会还原默认的1024 FD文件描述符限制.当前用户当前会话有效
     [root@bdi23 ~]# ulimit -n 2000
     备注:用此命令可以设置当前会话原FD数量限制
      再用ulimit -n或ulimit -a可以查看设置是否成功
     [root@bdi23 ~]# ulimit -n
     2000
     [root@bdi23 ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 30516
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 2000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 30516
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

       2.4.2为某个用户永久生效FD限制数量
    当退出后重新登录,此用户的FD限制数量为修改后的限制数量
    [root@bdi23 ~]# vi /etc/security/limits.conf
    在文件末尾加入
    fly              hard    nofile          100
   //第一列 fly :指定的用户名,更改后fly用户的每一个进程都可以使用的FD限制数量为100
   //第二列 hard:限制类型,soft,当系统达到此类型的FD限制数量时,会在/var/log/messages中记录一条日志,但不影响使用。hard,当系统达到此类型的FD限制数量时,也会记录一条日志,但会影响使用
   //第三列 nofile:限制的内容
   //第四列 限制的值

     2.4.3 用fly用户登录系统,ulimit -n 或 ulimit -a 查看设置结果
    [fly@bdi23 ~]$ ulimit -n
     100
[fly@bdi23 ~]$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 30516
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 100
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

备注:还可以通过修改某个用户的.bash_profile文件来达到这个效果,在文件中加入ulimit -n 200
   [root@bdi23 ~]# echo "ulimit -n 200" >> /home/fly/.bash_profile

这个在机器上试的时候,没有成功。没有成功的原因是因为在/etc/security/limits.conf文件中添加了fly hard nofile 100.所以由此可见,/etc/security/limits.conf的文件优先级要高于.bash_profile文件。
       2.4.4为整个系统设置最大FD数量
     echo "51200" >> /proc/sys/fs/file-max
     root@bdi23 ~]# cat /proc/sys/fs/file-nr
     2304  0 51200
  备注:像这样设置后,系统重启会将最大值默认还原
       2.4.5为整个系统永久设置最大值
      echo "fs.file-max = 51200" >> /etc/systcl.conf
   3 lsof的常用命令
       3.1查看整个系统的文件打开数量
        [root@bdi23 ~]# lsof | wc -l
         3491
       3.2查看某个用户打开的文件数量
         [root@bdi23 ~]# lsof -u k | wc -l
         102
       3.3查看某个程序打开的文件数量
         [root@bdi23 ~]# pidof vim
          9777
          [root@bdi23 ~]# lsof -p 9777 | wc -l
           27
  


最常见的文件交互方式是系统调用。
一文件表:在对文件进行读写操作之前要对文件进行打开操作,内核会为每个进程维护一张打开的文件表。子进程会维护你进程的文件表副本,当子进程关闭文件时不会影响父进程的文件表,只会影响自己的文件表。这个文件表里面存储的是FD[每个进程至少包含三个FD]
二打开文件
  最常见的文件访问方法是系统调用read(),write().但之前要通过open()或create()来打开文件。读写完成还要close()文件。

  





      
 
分享到:
评论

相关推荐

    用来操作文件描述符的一些特性

    参数fd代表欲设置的文件描述词,参数cmd代表欲操作的指令用来操作文件描述符的一些特性。参数fd代表欲设置的文件描述词,参数cmd代表欲操作的指令用来操作文件描述符的一些特性。参数fd代表欲设置的文件描述词,参数...

    Select()系统调用及 文件描述符集fd_set的应用.rar_fd_set_select fd_select sock

    Select()系统调用及 文件描述符集fd_set的应用.rar

    基于select的Linux串口485读写,文件描述符 fd_set

    基于linux ,使用select检测串口句柄事件,同时进行超时判断的串口485读写操作。为高效可控的linux串口操作例程。tcsetattr,tcflush,select,ioctl,gettimeofday。485收发方向切换。

    fd:Swift文件描述符套接字库

    fd:文件描述符 Swift文件描述符库。 fd是基础系统文件描述符和套接字API之上的最小层。 用法 FileDescriptor FileDescriptor是包含单个属性(fileNumber)的协议。 protocol FileDescriptor { var fileNumber: ...

    进程间传递文件描述符代码

    其中send进程打开554端口监听fd,然后将它发送给recv进程,然后自己关闭。recv进程接收fd后,执行select监听,直到接收到554端口的RTSP请求消息。 使用方法: gcc -o send fd_send.c gcc -o recv fd_recv.c 打开2个...

    linux下文件描述符限制问题

    问题过去有段时间了,忘记当时怎么想到是超过文件描述符限制了。大概是根据句柄的值或者返回的错误码了。 嗯。linux下文件描述符最大限制默认最大为1024,通过 [root@localhost ~]# ulimit -n 1024 这个命令可以...

    android进程间socket传递Ashmem的文件描述符

    android传递大文件的话,第一想到的就是匿名共享内存了,但是进程间怎么共享匿名共享内存的。试想进程A创建匿名共享内存,进程B怎么得共享内存读出数据?熬得凌晨2点多写个demo,备忘和分享!

    linux中通过文件描述符获取文件绝对路径的方法

    其实很简单,在linux中每个被打开的文件都会在/proc/self/fd/目录中有记录,其中(/proc/self/fd/文件描述符号)的文件就是文件描述符所对应的文件。说道这里我们先停下了说一个函数: readlink(取得符号连接所指的...

    fd-lock:使用文件描述符对文件进行咨询性跨平台锁定

    使用文件描述符对文件的咨询性跨平台锁定。 npm install fd-lock 用法 const lock = require ( 'fd-lock' ) // Can we lock the file using the fd? console . log ( lock ( fd ) ) 原料药 bool = lock(fd) 尝试...

    Linux中文件描述符fd与文件指针FILE*互相转换实例解析

    主要介绍了Linux中文件描述符fd与文件指针FILE*互相转换实例解析,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

    fd-lock-使用文件描述符对文件的咨询性跨平台锁定-Rust开发

    fd-lock使用文件描述符的咨询性跨平台文件锁。 改编自mafintosh / fd-lock。 请注意,咨询性锁合规性是可选的,并且c fd-lock咨询性跨平台文件锁使用文件描述符。 改编自mafintosh / fd-lock。 请注意,咨询性锁合规...

    Linux内核中的文件描述符:fd的分配–get_unused_fd

    在Linux内核中主要有两个函数涉及到文件描述符的分配:get_unused_fd和locate_fd。本文主要讲解get_unused_fd,将会在下一篇文章中介绍locate_fd。首先给出get_unused_fd的定义(fs/open.c): int get_unused_fd...

    Lua的epoll模块lua-epoll.zip

    ok,err=epoll.register(epfd,fd,eventmask) 把目标文件描述符 fd 注册到由 epfd 引用的 epoll 实例上并把相应的事件 event 与内部的 fd 相链接。ok,err=epoll.modify(epfd,fd,eventmask) 更改目标文件描述...

    腾讯后台开发面试题及答案

    起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针filp。 文件描述符的操作(如: open)返回的是一个文件描述符,内核会在每个进程空间中维护一个文件描述符表, 所有打开的文件都将通过此表中...

    fd:在不同的OS进程之间传递Go文件描述符和连接

    软件包fd提供了一个简单的API,可以在不同的OS进程之间传递文件描述符。 如果您想从另一个进程继承网络连接而不关闭它们,则可能会很有用。 示例方案: 正在运行的服务器收到“让我们升级”消息 服务器为“升级...

    linux 下socket通信中select的用法实例

    fd_set集合可以通过一些宏由人为来操作,比如清空集合FD_ZERO(fd_set *),将一个给定的文件描述符加入集合之中FD_SET(int ,fd_set *),将一个给定的文件描述符从集合中删除FD_CLR(int ,fd_set*),检查集合中指定的...

    mmap:节点mmap实施

    文件描述符。 您也可以使用文件名(字符串)。 当您执行此操作时, mmap()会尝试通过将文件创建或增长到n_bytes(如有必要)来执行正确的操作。 抵消 文件偏移量。 必须为零或mmap.PAGESIZE的倍数。 安装了终结...

    ti-fs:node.js 的 fs 模块的 Titanium 实现

    t-fs 用于 Titanium 的 node.js 样式的fs 。 它可以作为 node.js fs替代品,与一起使用。 安装 $ npm install ti-fs ... 假定所有fd文件描述符都是实例。 注意事项 Titanium 流(在本例中为 )不支持p

    前端开源库-fd-lock

    前端开源库-fd-lockfd lock,建议使用文件描述符对文件进行跨平台锁定。

    笔记_Linux编程.doc

    笔记_Linux编程 内容,linux下文件读取方法 Open,write close 与C标准库的fopen,fwrite,fclose区别: 1\write不用关闭即写入到文件,没有... fdopen(fd,”wb”) //C标准库函数,通过文件打开表的文件描述符得到文件指针

Global site tag (gtag.js) - Google Analytics