Chinaunix首页 | 论坛 | 博客
  • 博客访问: 893917
  • 博文数量: 132
  • 博客积分: 9976
  • 博客等级: 中将
  • 技术积分: 1781
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-30 20:40
文章分类

全部博文(132)

文章存档

2013年(1)

2011年(1)

2010年(15)

2009年(77)

2008年(36)

2007年(2)

我的朋友

分类: C/C++

2008-04-17 17:24:01

文件描述符和文件上下文

==========================================
来源: 

文件描述符概述
  (kernel)利用文件描述符(file descriptor)来访问。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。

  习惯上,标准输入(standard input)的文件描述符是 0,标准输出(standard output)是 1,标准错误(standard error)是 2。尽管这种习惯并非 内核的特性,但是因为一些 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用户才能修改这些内核值。

  
  管理用户可以在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操作系统上,文件描述符被称作文件句柄。在windows2000服务器上,打开文件的句柄极限设置为16,384。此数量可以在任务管理器的性能摘要中监视。

  
   nfile定义打开文件的最大数量。此值通常由以下公式来确定:((nproc*2)+1000),其中nproc通常为:((maxusers*5) +64)。如果maxusers等于400,则经过计算得到此值为5128。通常可以将此值设高一些。maxfiles是每个进程的软文件极限, maxfiles_lim是每个进程的硬文件极限。

  
  文件描述符极限在/etc/security/limits文件中设置,它的缺省值是2000。此极限可以通过ulimit命令或setrlimit子例程来更改。最大大小由open_max常数来定义。
==========================================
来源:  http://www.linuxdiyf.com/blog/?77708/action_viewspace_itemid_1850.html

是个很小的正整数,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。

  文件描述符的优点:兼容POSIX标准,许多和系统调用都依赖于它。

  文件描述符的缺点:不能移植到UNIX以外的系统上去,也不直观。

    基于文件描述符的输入输出函数:

  open:打开一个文件,并指定访问该文件的方式,调用成功后返回一个文件描述符。

  creat:打开一个文件,如果该文件不存在,则创建它,调用成功后返回一个文件描述符。

  close:关闭文件,进程对文件所加的锁全都被释放。

  read:从文件描述符对应的文件中读取数据,调用成功后返回读出的字节数。

  write:向文件描述符对应的文件中写入数据,调用成功后返回写入的字节数。

  ftruncate:把文件描述符对应的文件缩短到指定的长度,调用成功后返回0。

  lseek:在文件描述符对应的文件里把文件指针设定到指定的位置,调用成功后返回新指针的位置。

  fsync:将所有已写入文件中的数据真正写到磁盘或其他下层设备上,调用成功后返回0。

  fstat:返回文件描述符对应的文件的相关信息,把结果保存在struct stat中,调用成功后返回0。

  fchown:改变与打开文件相关联的所有者和所有组,调用成功后返回0。

  fchmod:把文件描述符对应的文件的权限位改为指定的八进制模式,调用成功后返回0。

  flock:用于向文件描述符对应的文件施加建议性锁,调用成功后返回0。

  fcntl:既能施加建议性锁也能施加强制性锁,能建立记录锁、读取锁和写入锁,调用成功后返回0。

  dup:复制文件描述符,返回没使用的文件描述符中最小的编号。

  dup2:由用户指定返回的文件描述符的值,用来重新打开或重定向一个文件描述符。

  select:同时从多个文件描述符读取数据或向多个文件描述符写入数据。


阅读(923) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~