文件描述符概述
内核
(kernel)利用文件描述符(file descriptor
)来访问文件
。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。
习惯上,标准输入(standard input)的文件描述符是 0,标准输出(standard output)是 1,标准错误(standard error)是 2。尽管这种习惯并非 Unix
内核的特性,但是因为一些 shell 和很多应用程序都使用这种习惯,因此,如果内核不遵循这种习惯的话,很多应用程序将不能使用。
POSIX 定义了 STDIN_FILENO、STDOUT_FILENO 和 STDERR_FILENO 来代替 0、1、2。这三个符号常量的定义位于头文件 unistd.h。
文件描述符的有效范围是 0 到 OPEN_MAX。一般来说,每个进程最多可以打开 64
个文件(0 — 63)。对于 FreeBSD 5.2.1、Mac OS X 10.3 和 Solaris 9
来说,每个进程最多可以打开文件的多少取决于系统内存的大小,int 的大小,以及系统管理员设定的限制。Linux 2.4.22
强制规定最多不能超过 1,048,576 。
文件描述符是由无符号整数表示的句柄,进程使用它来标识打开的文件。文件描述符与包括相关信息(如文件的打开模式、文件的位置类型、文件的初始类型等)的文件对象相关联,这些信息被称作文件的上下文。
如何创建文件描述符
进程获取文件描述符最常见的方法是通过本机子例程open或create获取或者通过从父进
程继承。后一种方法允许子进程同样能够访问由父进程使用的文件。文件描述符对于每个进程一般是唯一的。当用fork子例程创建某个子进程时,该子进程会获
得其父进程所有文件描述符的副本,这些文件描述符在执行fork时打开。在由fcntl、dup和dup2子例程复制或拷贝某个进程时,会发生同样的复制
过程。
第二个异常在JVM进程缺乏文件描述符时出现(尽管在执行forkAndExec()子例程时丆需要新的文件描述符来复制父进程的文件描述符)。对于每个进程,操作系统内核在u_block结构中维护文件描述符表,所有的文件描述符都在该表中建立索引。
如何在不同平台上定义文件描述符的数量
文件描述符极限以及可分配给进程的最大大小由资源限制来定义。这些值应当按照在WebLogicServer文档中建议的、特定于操作系统的文件描述符值来设置:
对于WLS8.1:调整硬件、操作系统和网络性能
对于WLS7.0:调整硬件、操作系统和网络性能
对于WLS6.1:调整硬件、操作系统和网络性能
Unix和Linux都有文件描述符。不过,二者的主要区别在于如何设置文件描述符的硬极限值、缺省值和配置过程。
Solaris
/usr/bin/ulimit实用程序定义允许单个进程使用的文件描述符的数量。它的最大值在rlim_fd_max中定义,在缺省情况下,它设置为65,536。只有root用户才能修改这些内核值。
Linux
管理用户可以在etc/security/limits.conf配置文件中设置他们的文件描述符极限,如下例所示。
softnofile1024
hardnofile4096
系统级文件描述符极限还可以通过将以下三行添加到/etc/rc.d/rc.local启动脚本中来设置:
#Increasesystem-widefiledescriptorlimit.
echo4096>/proc/sys/fs/file-max
echo16384>/proc/sys/fs/inode-max
Windows
在Windows操作系统上,文件描述符被称作文件句柄。在Windows2000服务器上,打开文件的句柄极限设置为16,384。此数量可以在任务管理器的性能摘要中监视。
HP-UX
nfile定义打开文件的最大数量。此值通常由以下公式来确定:
((NPROC*2)+1000),其中NPROC通常为:((MAXUSERS*5)+64)。如果MAXUSERS等于400,则经过计算得到此值为
5128。通常可以将此值设高一些。maxfiles是每个进程的软文件极限,maxfiles_lim是每个进程的硬文件极限。
AIX
文件描述符极限在/etc/security/limits文件中设置,它的缺省值是2000。此极限可以通过ulimit命令或setrlimit子例程来更改。最大大小由OPEN_MAX常数来定义。
分享到:
相关推荐
### 用来操作文件描述符的一些特性 在计算机编程中,文件描述符(File Descriptor)是操作系统分配给文件或I/O资源的标识符,主要用于文件、设备、管道等的读写操作。在Unix和类Unix系统中,文件描述符通常是一个非负...
【嵌入式开发教程之Linux进程与它的文件描述符】是一个深入探讨Linux系统中进程管理和文件操作的主题。在这个教程中,我们将重点解析五个关键部分: 一、概述:在Linux操作系统中,每个进程都有一个独立的文件描述...
本示例探讨的是如何通过Socket在不同Android进程中传递Ashmem(Anonymous Shared Memory)的文件描述符,以实现大文件的有效共享。Ashmem是一种内核支持的内存分配机制,允许多个进程访问同一块内存区域,从而提高...
在计算机科学,特别是操作系统领域,文件描述符(File Descriptor)是一个关键的概念,特别是在Linux和类Unix系统中。文件描述符是进程与操作系统交互的一种方式,主要用于读写文件、网络通信等I/O操作。以下是关于...
标题中的“文件描述符本质1”指的是在操作系统中,文件描述符是访问文件或设备的基本方式,它是进程间通信和I/O操作的核心概念。在这个话题下,我们将深入探讨文件描述符的概念、工作原理以及在实际编程中的应用。 ...
fcntl函数复制文件描述符,此例只是用来留作笔记,
在Linux系统中,文件描述符是操作系统用于标识和操作打开文件的一种抽象机制。当一个程序打开一个文件时,系统会分配一个唯一的文件描述符给它,通常从0开始(标准输入),1(标准输出),2(标准错误)。在这个场景...
在操作系统中,`select()`系统调用是一种多路复用I/O模型,它允许程序同时监控多个文件描述符,等待这些描述符中的任意一个或多个准备进行读写操作。这个功能在开发网络服务器或者需要处理多个并发连接的程序时尤其...
自己二次开发的代码,简单易用,一共330行。 基本思路:2个单独的进程:send 和 recv。其中send进程打开554端口监听fd,然后将它发送给recv进程,然后自己关闭。recv进程接收fd后,执行select监听,直到接收到554端口...
### 经由UNIX域套接字传送文件描述符的关键知识点 #### 1. 前言:文件描述符传输的重要性 文件描述符是操作系统分配给已打开文件的唯一标识符,通常是一个非负整数。在进程间通信(IPC)中,能够直接传输文件描述符...
在Linux操作系统中,Socket文件描述符是用于标识进程间通信(IPC)中网络连接状态的一种方式。通过Socket文件描述符,我们可以了解一个进程中的网络连接情况,包括连接的状态、地址等信息。本文将详细介绍如何利用/...
在Linux系统编程中,文件描述符(File Descriptor)是操作系统用来标识进程打开的文件或设备的一个非负整数值。它们是进程与内核交互的重要工具,用于读写数据。本篇文章将深入探讨如何通过`dup()`和`dup2()`两个...
问题过去有段时间了,忘记当时怎么想到是超过文件描述符限制了。大概是根据句柄的值或者返回的错误码了。 嗯。linux下文件描述符最大限制默认最大为1024,通过 [root@localhost ~]# ulimit -n 1024 这个命令可以...
关闭文件描述符
在Linux内核中,文件描述符是操作系统用来标识和跟踪进程打开文件的一种机制。它是一个非负整数,用于区分进程中的不同打开文件。当进程通过`open`系统调用打开一个文件时,内核会创建一个`file`结构实例,这个实例...
在Bash shell编程中,文件描述符是至关重要的概念,它们是操作系统与程序之间交互数据的主要方式。文件描述符是一个非负整数,用于标识进程打开的文件或管道。在Linux系统中,一切皆文件,包括设备、网络连接等,都...
SQUID默认文件描述符为:2048往往访问量比较大时就会出现文件描述符不足的错误. 本下载经过海豹同学的重新编绎,把文件描述符修改为20480.大家下载后直接用就好了. 如需自已重新编绎,请查看博客:hi.baidu.com/jiahai
基于linux ,使用select检测串口句柄事件,同时进行超时判断的串口485读写操作。为高效可控的linux串口操作例程。tcsetattr,tcflush,select,ioctl,gettimeofday。485收发方向切换。
对紧凑型二进制文件描述符的高效有区别预测
创建输出文件描述符