檔案描述符

2021-05-27 16:49:42 字數 4343 閱讀 8617

作業系統程序表中存放各個檔案進行檔案描述

核心(kernel)利用檔案描述符(file descriptor)來訪問檔案。檔案描述符是非負整數。開啟現存盤案或新建檔案時,核心會返回乙個檔案描述符。讀寫檔案也需要使用檔案描述符來指定待讀寫的檔案。

目錄檔案描述符概述

如何建立檔案描述符

使用的好處

缺點如何在不同平台上定義檔案描述符的數量

linux

window

hp-ux

aix 另外解決方法

檔案描述符概述

如何建立檔案描述符

使用的好處

缺點如何在不同平台上定義檔案描述符的數量

linux

window

hp-ux

aix 另外解決方法

展開

習慣上,標準輸入(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結構中維護檔案描述符表,所有的檔案描述符都在該表中建立索引。

檔案描述符的好處主要有兩個:

基於檔案描述符的i/o操作相容

posix標準。

在unix、

linux的

系統呼叫中,大量的系統呼叫都是依賴於檔案描述符。

例如,下面的**就示範了如何基於檔案描述符來讀取當前目錄下的乙個指定檔案,並把檔案內容列印至console中。

此外,在linux系列的作業系統上,由於linux的設計思想便是把一切裝置都視作檔案。因此,檔案描述符為在該系列平台上進行裝置相關的程式設計實際上提供了乙個統一的方法。

#include

#include <

stdlib.h>

#include <

string.h>

#include

#include <

sys/types.h>

#include

#include <

fcntl.h>

int main(void) memset(buf, 0x00, 256);

while((numbytes = read(fd, buf, 255)) > 0) close(fd);

exit(

exit_success);}

檔案描述符的概念存在兩大缺點:

在非unix/

linux作業系統上(如windows nt),無法基於這一概念進行程式設計。

由於檔案描述符在形式上不過是個整數,當**量增大時,會使程式設計者難以分清哪些整數意味著資料,那些意味著檔案描述符。因此,完成的**可讀性也就會變得很差。

檔案描述符極限以及可分配給程序的最大大小由資源限制來定義。這些值應當按照在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常數來定義。

對於ansi c規範中定義的標準庫的檔案i/o操作。ansi c規範給出了乙個解決方法,就是使用file結構體的指標。事實上,unix/linux平台上的file結構體的實現中往往都是封裝了檔案描述符變數在其中。

在unix/linux平台上,對於控制台(console)的標準輸入,標準輸出,標準錯誤輸出也對應了三個檔案描述符。它們分別是0,1,2。在實際程式設計中,如果要操作這三個檔案描述符時,建議使用標頭檔案中定義的三個巨集來表示: stdin_fileno, stdout_fileno以及stderr_fileno。 與檔案描述符相關的操作

檔案描述符的生成

open(), open64(), creat(), creat64()

socket()

socketpair()

pipe()

與單一檔案描述符相關的操作

read(), write()

recv(), send()

recvmsg(), sendmsg()

sendfile()

lseek(), lseek64()

fstat(), fstat64()

fchmod()

fchown()

與複數檔案描述符相關的操作

select(), pselect()

poll()

與檔案描述符表相關的操作

close()

dup()

dup2()

fcntl (f_dupfd)

fcntl (f_getfd and f_setfd)

改變程序狀態的操作

fchdir()

mmap()

與檔案加鎖的操作

flock()

fcntl (f_getlk, f_setlk and f_setlkw)

lockf()

與套接字相關的操作

connect()

bind()

listen()

accept()

getsockname()

getpeername()

getsockopt(), setsockopt()

shutdown()

mysql 檔案描述符 檔案描述符

toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...

檔案描述符

檔案描述符 是個很小的正整數,它是乙個索引值,指向核心為每乙個程序所維護的該程序開啟檔案的記錄表。檔案描述符的優點 相容posix標準,許多 linux 和unix 系統呼叫都依賴於它。檔案描述符的缺點 不能移植到unix以外的系統上去,也不直觀。基於檔案描述符的輸入輸出函式 open 開啟乙個檔案...

檔案描述符

檔案描述符是乙個簡單的整數,用以標明每乙個被程序所開啟的檔案和socket。第乙個開啟的檔案是0,第二個是1,依此類推。unix 作業系統通常給每個程序能開啟的檔案數量強加乙個限制。更甚的是,unix 通常有乙個系統級的限制。因為squid 的工作方式,檔案描述符的限制可能會極大的影響效能。當squ...