`

linux下文件描述符的介绍

阅读更多

当某个程序打开文件时,操作系统返回相应的文件描述符,程序为了处理该文件必须引用此描述符。所谓的文件描述符是一个低级的正整数。最前面的三个文件描述符(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下文件描述符限制问题

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

    嵌入式开发教程之linux进程与它的文件描述符--千锋培训

    【嵌入式开发教程之Linux进程与它的文件描述符】是一个深入探讨Linux系统中进程管理和文件操作的主题。在这个教程中,我们将重点解析五个关键部分: 一、概述:在Linux操作系统中,每个进程都有一个独立的文件描述...

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

    在Linux系统中,`fcntl()`函数就是一个典型的例子,它允许程序员通过不同的`cmd`参数来控制文件描述符的行为,如`F_GETFL`获取文件标志、`F_SETFL`设置文件标志等。 #### 特性示例:网络套接字操作 在上述部分提供...

    文件描述符1

    在计算机科学,特别是操作系统领域,文件描述符(File Descriptor)是一个关键的概念,特别是在Linux和类Unix系统中。文件描述符是进程与操作系统交互的一种方式,主要用于读写文件、网络通信等I/O操作。以下是关于...

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

    Socket不仅可以传输数据,还可以通过`sendmsg()`和`recvmsg()`系统调用传递文件描述符,这得益于Linux的`sendfile()`和`splice()`系统调用的扩展。 具体实现步骤如下: 1. **创建Ashmem**:在进程A中,通过` ...

    Linux中通过Socket文件描述符寻找连接状态介绍.docx

    本文将详细介绍如何利用/Linux/proc/目录下的文件系统来查看Socket文件描述符的连接状态。 首先, `/proc` 是Linux内核提供的一种虚拟文件系统,它暴露了关于系统运行时状态的信息。例如,`/proc/&lt;pid&gt;/fd` 目录...

    linux进程描述符

    此外,它还记录了进程的时间信息(如utime, stime, cutime, cstime),信号处理信息(如pending和blocked信号),文件系统状态(由`fs_struct`表示),打开的文件描述符,以及等待队列等。 进程描述符的`thread_...

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

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

    Linux进程间传递文件描术符事例代码

    文件描述符是Linux系统中对打开文件的一种抽象表示,每个进程都有一个文件描述符表,用于管理其打开的文件或套接字等资源。本示例代码将探讨如何在两个进程之间传递文件描述符,以实现数据共享。 首先,我们来看`...

    linux 文件I/O编程

    1. **open()**: `open`函数是用于打开一个文件的,它返回一个文件描述符,后续的文件操作都将通过这个描述符进行。该函数接受两个参数:文件名和操作模式(如只读、只写、读写等)。例如,`open("filename", O_...

    并发时-修改Linux系统下的大文件描述符限制

    通常我们通过终端连接到linux系统后执行ulimit -n 命令可以看到本次登录的session其文件描述符的限制,如下:  $ulimit -n  1024  当然可以通过ulimit -SHn 102400 命令来修改该限制,但这个变更只对当前的...

    LINUX进程间传递描述符.pdf

    在Linux下,进程间传递描述符是一种高级的IPC形式,它允许一个进程向另一个进程传递已经打开的文件描述符。这种方式允许进程间共享文件、管道、套接字等资源,而无需复制数据本身。 首先,理解文件描述符是操作系统...

    Linux文件变成--介绍了一些关于Linux的文件变成的一些知识希望对部分朋友有用

    本篇文章将深入探讨Linux文件系统中的某些关键概念,包括特殊文件、文件描述符、文件操作函数以及文件权限。 1. 特殊文件: - `/dev/console`:系统控制台,用于与用户的交互。 - `/dev/tty`:当前终端设备,指向...

    Linux内核中的文件描述符.docx

    在Linux内核中,文件描述符是操作系统用来标识和跟踪进程打开文件的一种机制。它是一个非负整数,用于区分进程中的不同打开文件。当进程通过`open`系统调用打开一个文件时,内核会创建一个`file`结构实例,这个实例...

    USB报告描述符自动生成工具 HID Descriptor tool

    至于“hid descriptor tool”这个文件名,很可能是该工具的执行程序或者源代码文件,用户可以通过运行或编译这个文件来使用HID描述符自动生成的功能。 USB报告描述符是HID设备的关键部分,它定义了设备如何与主机...

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

    在Linux操作系统中,文件描述符(File Descriptor, fd)和文件指针(FILE *)是两种不同的方式,用于访问和操作文件。它们各自有其特点和应用场景,有时需要在两者之间进行转换。以下是对这两个概念的详细解释以及...

    linux下文件操作

    在Linux下进行文件操作时,通常会用到文件描述符,这是用于标示打开文件的一个整数,用于区分各种文件类型和进行各种文件操作。 1. 普通文件是存储在磁盘上的常规数据文件,它允许用户进行随机访问,即通过指针定位...

    通过文件描述符恢复被误删除的文件(前提是文件正被某一个进程占用着,未被释放)

    在这个目录下,每个数字文件都是一个进程打开的文件描述符。例如,如果我们发现进程的文件描述符为3指向被删除的文件,我们可以使用以下命令来恢复: ```bash cp /proc/${pid}/fd/3 recovered_file ``` 这将复制...

Global site tag (gtag.js) - Google Analytics