檔案描述子(File descriptor)是電腦科學中的一個術語,是一個用於表述指向檔案的參照的抽象化概念。
概要
檔案描述子在形式上是一個非負整數。實際上,它是一個索引值,指向核心為每一個行程所維護的該行程打開檔案的記錄表。當程式打開一個現有檔案或者建立一個新檔案時,核心向行程傳回一個檔案描述子。在程式設計中,一些涉及底層的程式編寫往往會圍繞著檔案描述子展開。但是檔案描述子這一概念往往只適用於UNIX、Linux這樣的作業系統。
每個Unix行程(除了可能的常駐程式)應均有三個標準的POSIX檔案描述子,對應於三個標準流:
整數值 | 名稱 | <unistd.h>符號常數[1] | <stdio.h>檔案流[2] |
---|---|---|---|
0 | Standard input | STDIN_FILENO | stdin |
1 | Standard output | STDOUT_FILENO | stdout |
2 | Standard error | STDERR_FILENO | stderr |
檔案描述子的優點主要有兩個:
例如,下面的程式碼就示範了如何基於檔案描述子來讀取當前目錄下的一個指定檔案,並把檔案內容列印至主控臺。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
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);
}
memset(buf, 0x00, 256);
while((numbytes = read(fd, buf, 255)) > 0){
printf("%d bytes read: %s", numbytes, buf);
memset(buf, 0x00, 256);
}
close (fd);
exit(EXIT_SUCCESS);
}
此外,在Linux系列的作業系統上,由於Linux的設計思想便是把一切裝置都視作檔案。因此,檔案描述子的存在提供了程式操作裝置的統一方法。
檔案描述子的概念存在兩大缺點:
- 對於ANSI C規範中定義的標準庫的檔案I/O操作。ANSI C規範給出了一個解決方法,就是使用FILE結構體的指標。事實上,UNIX/Linux平台上的FILE結構體的實作中往往都是封裝了檔案描述子變數在其中。
- 在UNIX/Linux平台上,對於主控臺(Console)的標準輸入,標準輸出,標準錯誤輸出也對應了三個檔案描述子。它們分別是0,1,2。在實際程式設計中,如果要操作這三個檔案描述子時,建議使用<unistd.h>標頭檔中定義的三個巨集來表示:STDIN_FILENO, STDOUT_FILENO以及STDERR_FILENO.
- 對於一個行程而言,檔案描述子的變化範圍為0~OPEN_MAX[註 1].
與檔案描述子相關的操作
- open(), creat()
- socket()
- socketpair()
- pipe()
- read(), write()
- recv(), send()
- recvmsg(), sendmsg()
- sendfile()
- lseek()
- fstat()
- fchmod()
- fchown()
- select(), pselect()
- poll(),epoll()
- 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()
- ioctl()
注釋
參考文獻
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.