⽂件描述符
⽂件描述符概述
习惯上,标准输⼊(standard input )的⽂件描述符是 0,标准输出(standard output )是 1,标准错误(standard error )是 2。尽管这种习惯并⾮ 内核的特性,但是因为⼀些 shell 和很多 都使⽤这种习惯,因此,如果内核不遵循这种习惯的话,很多应⽤程序将不能使⽤。
POSIX 定义了 STDIN_FILENO 、STDOUT_FILENO 和 STDERR_FILENO 来代替 0、1、2。这三个符号常量的定义位于头⽂件 unistd.h 。
homo是什么意思
⽂件描述符的有效范围是 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 结构中维护⽂件描述符表,所有的⽂件描述符都在该表中建⽴索引。
使⽤的好处
⽂件描述符的好处主要有两个:
基于⽂件描述符的I/O 操作兼容 标准。
在UNIX 、 的 中,⼤量的系统调⽤都是依赖于⽂件描述符。
例如,下⾯的代码就⽰范了如何基于⽂件描述符来读取当前⽬录下的⼀个指定⽂件,并把⽂件内容打印⾄Console 中。
此外,在Linux 系列的操作系统上,由于Linux 的设计思想便是把⼀切设备都视作⽂件。因此,⽂件描述符为在该系列平台上进⾏设备相关的编程实际上提供了⼀个统⼀的⽅法。
#include <stdio.h>
#include < >
#include < >
#include <unistd.h>
#include < >
⽂件描述符
百科名⽚
内核(kernel )利⽤⽂件描述符(file descriptor )来访问⽂件。⽂件描述符是⾮负整数。打开现存⽂件或新建⽂件时,内核会返回⼀个⽂件描述符。读写⽂件也需要使⽤⽂件描述符来指定待读写的⽂件。操作系统进程表中存放各个⽂件进
⾏⽂件描述
#include <sys/stat.h>
#include < >
int main(void){ int fd; int numbytes; char path[] = "file"; char buf[256]; /*
* O_CREAT: 如果⽂件不存在则创建
* O_RDONLY:以只读模式打开⽂件
*/
fd = open(path, O_CREAT | O_RDONLY, 0644);
if(fd < 0){ perror("open()");
exit(EXIT_FAILURE); } memt(buf, 0x00, 256);
while((numbytes = read(fd, buf, 255)) > 0){ printf("%d bytes read: %s", numbytes, buf);
memt(buf, 0x00, 256);
} clo(fd);
exit( );}联合国秘书长安南
缺点
⽂件描述符的概念存在两⼤缺点:
在⾮UNIX/ 上(如Windows NT),⽆法基于这⼀概念进⾏编程。
由于⽂件描述符在形式上不过是个整数,当代码量增⼤时,会使编程者难以分清哪些整数意味着数据,那些意味着⽂件描述符。因此,完成的代码可读性也就会变得很差。
如何在不同平台上定义⽂件描述符的数量
⽂件描述符极限以及可分配给进程的最⼤⼤⼩由资源限制来定义。这些值应当按照在WebLogicServer⽂档中建议的、特定于操作系统的⽂件描述符值来设置:
对于WLS8.1:调整硬件、操作系统和⽹络性能
对于WLS7.0:调整硬件、操作系统和⽹络性能
对于WLS6.1:调整硬件、操作系统和⽹络性能
Unix和Linux都有⽂件描述符。不过,⼆者的主要区别在于如何设置⽂件描述符的硬极限值、缺省值和配置过程。
Solaris
arabic
/usr/bin/ulimit实⽤程序定义允许单个进程使⽤的⽂件描述符的数量。它的最⼤值在rlim_fd_max中定义,在缺省情况下,它设置为65,536。只有root⽤户才能修改这些内核值。
Linux
管理⽤户可以在etc/f配置⽂件中设置他们的⽂件描述符极限,如下例所⽰。
softnofile1024
hardnofile4096
系统级⽂件描述符极限还可以通过将以下三⾏添加到/etc/rc.d/rc.local启动中来设置:
#Increasystem-widefiledescriptorlimit.
echo4096>/proc/sys/fs/file-max
echo16384>/proc/sys/fs/inode-max
Window
在Windows操作系统上,⽂件描述符被称作⽂件句柄。在Windows2000服务器上,打开⽂件的句柄极限设置为16,384。此数量可以在的性能摘要中监视。
HP-UX
nfile定义打开⽂件的最⼤数量。此值通常由以下公式来确定:((NPROC*2)+1000),其中NPROC通常为:((MAXUSERS*5)+64)。如果MAXUSERS等于400,则经过计算得到此值为5128。通常可以将此值设⾼⼀些。maxfiles是每个进程的软⽂件极限,maxfiles_lim是每个进程的硬⽂件极限。
AIX
⽂件描述符极限在/etc/curity/limits⽂件中设置,它的缺省值是2000。此极限可以通过ulimit命令或trlimit ⼦例程来更改。最⼤⼤⼩由OPEN_MAX常数来定义。
另外解决⽅法
对于ANSI C规范中定义的标准库的⽂件I/O操作。ANSI C规范给出了⼀个解决⽅法,就是使⽤FILE结构体的指针。事实上,UNIX/Linux平台上的FILE结构体的实现中往往都是封装了⽂件描述符变量在其中。
在UNIX/Linux平台上,对于控制台(Console)的标准输⼊,标准输出,标准错误输出也对应了三个⽂件描述符。它们分别是0,1,2。在实际编程中,如果要操作这三个⽂件描述符时,建议使⽤<unistd.h>头⽂件中定义的三个宏来表⽰: STDIN_FILENO, STDOUT_FILENO以及STDERR_FILENO。与⽂件描述符相关的操作
⽂件描述符的⽣成
open(), open64(), creat(), creat64()
socket()gohome
socketpair()
pipe()
与单⼀⽂件描述符相关的操作
read(), write()
recv(), nd()
recvmsg(), ndmsg()
ndfile()
lek(), lek64()
fstat(), fstat64()
fchmod()
fchown()
与复数⽂件描述符相关的操作
lect(), plect()
poll()
与⽂件描述符表相关的操作
the holiday
clo()
take my time dup()
dup2()
fcntl (F_DUPFD)
council fcntl (F_GETFD and F_SETFD)
改变进程状态的操作
fchdir()
mmap()
与⽂件加锁的操作
garfield
flock()
eing
fcntl (F_GETLK, F_SETLK and F_SETLKW) lockf()
与套接字相关的操作
connect()
bind()
yacht listen()
accept()
getsockname()
getpeername()
getsockopt(), tsockopt()
shutdown()