文件描述符概述

文件描述符概述

  內核(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常數來定義。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章