跳轉到內容

C 程式設計/POSIX 參考/unistd.h/open

來自華夏公益教科書,開放的書籍,開放的世界

對於大多數檔案系統,程式透過open 系統呼叫初始化對檔案檔案系統中的訪問。這會分配與檔案相關的資源(檔案描述符),並返回一個控制代碼,該程序將使用該控制代碼來引用該檔案。在某些情況下,第一次訪問時會執行 open 操作。

同一個檔案可以被多個程序同時開啟,甚至可以被同一個程序開啟(導致同一個檔案有多個檔案描述符),具體取決於檔案組織和檔案系統。對描述符的操作(例如移動檔案指標或關閉它)是獨立的(它們不影響同一個檔案的其他描述符)。檔案操作(例如寫入)可以被對其他描述符的操作看到(後面的讀取可以讀取寫入的資料)。

在開啟期間,檔案系統可能會為緩衝區分配記憶體(或者它可能等到第一次操作)。

解析絕對檔名。這可能包括連線到遠端主機並通知操作員需要可移動介質。它可能包括通訊裝置的初始化。如果主機或介質不可用,則可能返回錯誤。執行對檔案系統中目錄的至少第一次訪問。如果路徑的更高階元件(目錄)找不到或無法訪問,通常會返回錯誤。如果預期檔案存在但不存在,或者預期檔案不存在但存在,則會返回錯誤。

如果預期檔案存在並且存在,則根據檔案元資料或訪問控制列表中的許可權標誌限制,驗證檔案訪問是否與請求的操作型別一致。這通常需要額外的檔案系統訪問,儘管在某些檔案系統中元標誌可能是目錄結構的一部分。

如果正在建立檔案,檔案系統可能會根據檔案系統功能分配預設的初始儲存量或指定數量。如果失敗,將返回錯誤。更新目錄以包含新條目可能會執行,也可能會延遲到執行close

在開啟期間可能發生的各種其他錯誤包括目錄更新失敗、不允許的多個連線、介質故障、通訊鏈路故障和裝置故障。

必須始終檢查返回值並採取特定於錯誤的操作。

在許多情況下,特定於程式語言的執行時庫開啟可能會執行其他操作,包括初始化與檔案相關的執行時庫結構。

一旦不再需要檔案,程式應該close它。這將導致執行時庫和檔案系統緩衝區更新到物理介質,並允許其他程序訪問資料(如果需要獨佔使用)。一些執行時庫可能會close程式呼叫執行時退出時開啟的檔案。一些檔案系統可能會在程式終止時執行必要的操作。如果發生核心或電源故障,這兩種情況都不太可能發生。這會導致損壞的檔案系統結構,需要執行特權且耗時的檔案系統實用程式,在此期間整個檔案系統可能不可訪問。

open 呼叫引數

[edit | edit source]
  1. 檔案的路徑名
  2. 請求對檔案的訪問型別(讀取、寫入、追加等),
  3. 使用名為 mode 的第三個引數請求初始檔案許可權。此引數僅在建立新檔案時相關。

使用檔案後,程序應該使用close呼叫關閉檔案,該呼叫接受要關閉的檔案的檔案描述符。一些檔案系統包括允許釋放檔案的處置。

一些計算機語言包括執行時庫,其中包括針對特定檔案系統的附加功能。open(或某些輔助例程)可能包括金鑰大小、記錄大小、連線速度的規範。一些 open 例程包括在發生錯誤時要執行的程式程式碼的規範。

perl 語言形式

[edit | edit source]
open FILEHANDLE,MODE[,EXPR]

例如

  open(my $fh, ">", "output.txt") 

Perl 還使用 Tie::File 模組的 tie 函式將陣列與檔案關聯。[1] tie::AnyDBM_File 函式將雜湊與檔案關聯。[2]

C 庫 POSIX 定義

[edit | edit source]

open 呼叫由POSIX 規範標準化

int open (const char *path, int oflag, .../*,mode_t mode */);
int openat ...
int creat(const char *path, mode_t mode) 
FILE *fopen(const char *restrict filename, const char *restrict mode);

返回的值是檔案描述符,它是對程序特定結構的引用,該結構包含(除其他事項外)一個位置指標,該指標指示檔案中的哪個位置將被下一個操作操作。

Open 可能返回-1,指示失敗,errno 詳細說明錯誤。

檔案系統還更新所有開啟檔案的全域性表,該表用於確定檔案當前是否被任何程序使用。

要開啟的檔案的名稱。它包括檔案路徑,定義檔案在哪個檔案系統中找到(或應該建立)。

openat 期望相對路徑。

oflag
[edit | edit source]

此引數透過按位或可選引數和(來自 <fcntl.h>)以下之一來形成

O_RDONLYO_RDWR

可選引數包括

O_APPEND 寫入的資料將追加到檔案的末尾。檔案操作將始終將位置指標調整到檔案的末尾。
O_CREAT 如果檔案不存在,則建立它;否則,開啟操作將失敗,並將errno 設定為 ENOENT。
O_EXCLO_CREAT 一起使用,如果檔案已存在,則失敗,並將 errno 設定為 EEXIST。
O_TRUNC 如果檔案已存在,則丟棄其先前內容,將其縮減為空檔案。不適用於裝置或命名管道。

其他標誌和錯誤在open 呼叫中定義。

creat() 實現為

 int creat(const char *path, mode_t mode)
   { return open(path, O_WRONLY|O_CREAT|O_TRUNC, mode); }


fopen 使用字串標誌,例如 rwa+,並返回一個與 fgetsfputsfclose 一起使用的檔案指標。

mode_t
[edit | edit source]

僅在建立新檔案時可選且相關,定義 檔案許可權。這些包括所有者、組或所有使用者對檔案的讀、寫或執行許可權。模式由呼叫程序的 umask 掩蓋:umask 中設定的位將在模式中被清除。

另請參閱

[edit | edit source]

注意

[edit | edit source]
  1. "Tie::File". perldoc.perl.org. Retrieved 2011-08-07.
  2. "AnyDBM_File". perldoc.perl.org. Retrieved 2011-08-07.

參考文獻

[edit | edit source]
華夏公益教科書