文件描述符概述
内核(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常数来定义。
相关推荐
用来操作文件描述符的一些特性。参数fd代表欲设置的文件描述词,参数cmd代表欲操作的指令用来操作文件描述符的一些特性。参数fd代表欲设置的文件描述词,参数cmd代表欲操作的指令用来操作文件描述符的一些特性。参数...
文档介绍了一)概述,二)父/子进程对文件描述符的分支使用示例,三)文件描述符与/proc,四)文件描述符与lsof命令,五)文件描述符的限制
fcntl函数复制文件描述符,此例只是用来留作笔记,
自己二次开发的代码,简单易用,一共330行。 基本思路:2个单独的进程:send 和 recv。其中send进程打开554端口监听fd,然后将它发送给recv进程,然后自己关闭。recv进程接收fd后,执行select监听,直到接收到554端口...
1.描述: 2.系统为维护文件描述符,建立了三个表 3.通过这三个表,认识文件描述符 2.进程A和进程B打开了同一个文件,且文件描述 3.A、B中某个进程通过U
基于linux ,使用select检测串口句柄事件,同时进行超时判断的串口485读写操作。为高效可控的linux串口操作例程。tcsetattr,tcflush,select,ioctl,gettimeofday。485收发方向切换。
SQUID默认文件描述符为:2048往往访问量比较大时就会出现文件描述符不足的错误. 本下载经过海豹同学的重新编绎,把文件描述符修改为20480.大家下载后直接用就好了. 如需自已重新编绎,请查看博客:hi.baidu.com/jiahai
对紧凑型二进制文件描述符的高效有区别预测
android传递大文件的话,第一想到的就是匿名共享内存了,但是进程间怎么共享匿名共享内存的。试想进程A创建匿名共享内存,进程B怎么得共享内存读出数据?熬得凌晨2点多写个demo,备忘和分享!
问题过去有段时间了,忘记当时怎么想到是超过文件描述符限制了。大概是根据句柄的值或者返回的错误码了。 嗯。linux下文件描述符最大限制默认最大为1024,通过 [root@localhost ~]# ulimit -n 1024 这个命令可以...
通常我们通过终端连接到linux系统后执行ulimit -n 命令可以看到本次登录的session其文件描述符的限制,如下: $ulimit -n 1024 当然可以通过ulimit -SHn 102400 命令来修改该限制,但这个变更只对当前的...
fd:文件描述符 Swift文件描述符库。 fd是基础系统文件描述符和套接字API之上的最小层。 用法 FileDescriptor FileDescriptor是包含单个属性(fileNumber)的协议。 protocol FileDescriptor { var fileNumber: ...
Linux内核中的文件描述符.docx
Linux将所有内核对象当做文件来处理,系统用一个size_t类型来表示一个文件对象,比如对于文件描述符0就表示系统的标准输入设备STDIN,通常情况下STDIN的值为键盘,如read命令就默认从STDIN读取数据,当然STDIN的值是...
Select()系统调用及 文件描述符集fd_set的应用.rar
经过几天对UNIX域套接字传送文件描述符的学习,根据自己的认识对网络和书本上的知识进行了简单的整理,希望能帮到大家,让新手们比我少走些弯路。
Linux中通过Socket文件描述符寻找连接状态介绍.docx
进程文件描述符(pidfd)提供了一种无竞争的方式来管理Linux上的进程,使用文件描述符而不是在进程退出后可以重用的数字进程ID(PID)来维护对进程的持久引用。 Linux的进程文件描述符(pidfd)提供了一种无竞争的...
通过文件描述符恢复被误删除的文件(前提是文件正被某一个进程占用着,未被释放)
①编写Java文件 ②使用javac将.java编译成.class文件,然后使用javah编译相应的头文件 ③实现相关的.c/.cpp文件(实现头文件中定义的函数) ④编写Android.mk和Aplication.mk文件 ⑤利用ndk编译so库。