当某个程序打开文件时,操作系统返回相应的文件描述符,程序为了处理该文件必须引用此描述符。所谓的文件描述符是一个低级的正整数。最前面的三个文件描述符(0,1,2)分别与标准输入(stdin),标准输出(stdout)和标准错误(stderr)对应。因此,函数 scanf() 使用 stdin,而函数 printf() 使用 stdout。你可以用不同的文件描述符改写默认的设置并重定向进程的 I/O 到不同的文件。
1、首先说什么是文件描述符,它有什么作用?
文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket。第一个打开的文件是0,第二个是1,依此类推。Unix 操作系统通常给每个进程能打开的文件数量强加一个限制。更甚的是,unix 通常有一个系统级的限制。
因为squid 的工作方式,文件描述符的限制可能会极大的影响性能。当squid 用完所有的文件描述符后,它不能接收用户新的连接。也就是说,用完文件描述符导致拒绝服务。直到一部分当前请求完成,相应的文件和socket 被关闭,squid 不能接收新请
对于Apache,当使用了很多虚拟主机,而每个主机又使用了不同的日志文件时,Apache可能会遭遇耗尽文件描述符(有时也称为file handles)的困境。 Apache使用的文件描述符总数如下:每个不同的错误日志文件一个、 每个其他日志文件指令一个、再加10~20个作为内部使用。Unix操作系统限制了每个进程可以使用的文件描述符数量。典型上限是64个,但可以进行扩充,直至到达一个很大的硬限制为止(a large hard-limit)。
linux下最大文件描述符的限制有两个方面,一个是用户级的限制,另外一个则是系统级限制。
以下是查看Linux文件描述符的三种方式:
[root@localhost ~]# sysctl -a | grep -i file-max --color
fs.file-max = 392036
[root@localhost ~]# cat /proc/sys/fs/file-max
392036
[root@localhost ~]# ulimit -n
1024
[root@localhost ~]#
系统级限制:sysctl命令和proc文件系统中查看到的数值是一样的,这属于系统级限制,它是限制所有用户打开文件描述符的总和
用户级限制:ulimit命令看到的是用户级的最大文件描述符限制,也就是说每一个用户登录后执行的程序占用文件描述符的总数不能超过这个限制
如何修改文件描述符的值?
1、修改用户级限制
[root@localhost ~]# ulimit-SHn 10240
[root@localhost ~]# ulimit -n
10240
[root@localhost ~]#
以上的修改只对当前会话起作用,是临时性的,如果需要永久修改,则要修改如下:
[root@localhost ~]# grep -vE'^$|^#' /etc/security/limits.conf
* hard nofile 4096
[root@localhost ~]#
//默认配置文件中只有hard选项,soft 指的是当前系统生效的设置值,hard 表明系统中所能设定的最大值
[root@localhost ~]# grep -vE'^$|^#' /etc/security/limits.conf
* hard nofile 10240
* soft nofile 10240
[root@localhost ~]#
// soft<=hard soft的限制不能比hard限制高
2、修改系统限制
[root@localhost ~]# sysctl -wfs.file-max=400000
fs.file-max = 400000
[root@localhost ~]# echo350000 > /proc/sys/fs/file-max //重启后失效
[root@localhost ~]# cat /proc/sys/fs/file-max
350000
[root@localhost ~]#
//以上是临时修改文件描述符
//永久修改把fs.file-max=400000添加到/etc/sysctl.conf中,使用sysctl -p即可
下面是摘自kernel document中关于file-max和file-nr参数的说明 file-max & file-nr: 内核可以动态的分配文件句柄,但到目前为止是不会释放它们的
file-max的值是linux内核可以分配的最大文件句柄数。如果你看到了很多关于打开文件数已经达到了最大值的错误信息,你可以试着增加该值的限制
在kernel 2.6之前的版本中,file-nr 中的值由三部分组成,分别为:1.已经分配的文件句柄数,2.已经分配单没有使用的文件句柄数,3.最大文件句柄数。但在kernel 2.6版本中第二项的值总为0,这并不是一个错误,它实际上意味着已经分配的文件句柄无一浪费的都已经被使用了 |
摘录自:
http://blog.sina.com.cn/s/blog_8e48f19a01013lrb.html
http://blog.csdn.net/kumu_linux/article/details/7877770
相关推荐
linux下文件描述符最大限制默认最大为1024,通过 [root@localhost ~]# ulimit -n 1024 这个命令可以查看。此值可以修改。 进程的文件描述符,可以通过 [root@localhost ~]# ls -al /proc/13623/fd |wc -l 59 输出...
文档介绍了一)概述,二)父/子进程对文件描述符的分支使用示例,三)文件描述符与/proc,四)文件描述符与lsof命令,五)文件描述符的限制
基于linux ,使用select检测串口句柄事件,同时进行超时判断的串口485读写操作。为高效可控的linux串口操作例程。tcsetattr,tcflush,select,ioctl,gettimeofday。485收发方向切换。
Linux中通过Socket文件描述符寻找连接状态介绍.docx
Linux内核中的文件描述符.docx
通常我们通过终端连接到linux系统后执行ulimit -n 命令可以看到本次登录的session其文件描述符的限制,如下: $ulimit -n 1024 当然可以通过ulimit -SHn 102400 命令来修改该限制,但这个变更只对当前的...
在linux中,有时候我们只知道文件描述符却不知道它的名字及其完整的路径,如果我们想获取其路径该怎么办呢?其实很简单,在linux中每个被打开的文件都会在/proc/self/fd/目录中有记录,其中(/proc/self/fd/文件描述...
进程文件描述符(pidfd)提供了一种无竞争的方式来管理Linux上的进程,使用文件描述符而不是在进程退出后可以重用的数字进程ID(PID)来维护对进程的持久引用。 Linux的进程文件描述符(pidfd)提供了一种无竞争的...
主要介绍了Linux中文件描述符fd与文件指针FILE*互相转换实例解析,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
Linux将所有内核对象当做文件来处理,系统用一个size_t类型来表示一个文件对象,比如对于文件描述符0就表示系统的标准输入设备STDIN,通常情况下STDIN的值为键盘,如read命令就默认从STDIN读取数据,当然STDIN的值是...
在linux当中,每个进程会在进程控制块(PCB)当中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表都有一个指 向已经打开文件的指针。 每个linux进程都应该有三个标准的文件描述符,对应三个标准流。 ...
linux下,进程间传递文件描符的事例代码。
掌握Linux中系统调用的基本概念 ...掌握文件描述符的概念 掌握Linux下文件相关的不带缓存I/O函数的使用 掌握Linux下设备文件读写方法 掌握Linux中对串口的操作 熟悉Linux中标准文件I/O函数的使用
这里包含文件操作的一些用法,比如open read write lseek close 还有对文件添加读取锁和写入锁的一些内容
所有的Linux系统都会内建 vi 文书编辑器,目前主流使用比较多的是 vim 编辑器。vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。Vim是从 vi 发展出来的一个文本编辑器。代码补完、...
3\若在同一进程中,用两种方式打开不同文件(或先关闭再打开另一个),所用的文件打开表是同一个,但是在文件打开表中的文件描述符是不同的。 重要函数 fileno(fp) //得到文件指针所指向的文件打开表文件描述符。 ...
通过文件描述符恢复被误删除的文件(前提是文件正被某一个进程占用着,未被释放)
Linux系统编程——文件描述符的复制:dup()和dup2(),相关教程如下: http://blog.csdn.net/tennysonsky/article/details/45870459