跳到內容

C 語言入門/C 系統呼叫檔案 I/O

來自華夏公益教科書,自由的教科書

透過系統呼叫進行檔案 I/O 比呼叫 C 檔案 I/O 庫更簡單,並且在更低的級別上執行。有七個基本的檔案 I/O 系統呼叫

   creat()     Create a file for reading or writing.
   open()      Open a file for reading or writing.
   close()     Close a file after reading or writing.
   unlink()    Delete a file.

   write()     Write bytes to file.
   read()      Read bytes from file.

這些呼叫是為 UNIX 作業系統設計的,不是 ANSI C 規範的一部分。

使用這些系統呼叫需要一個名為 "fcntl.h" 的標頭檔案

   #include <fcntl.h>

"creat()" 系統呼叫,當然,會建立一個檔案。它有以下語法

   <file descriptor variable> = creat( <filename>, <protection bits> );

此係統呼叫返回一個整數,稱為 "檔案描述符",它是一個標識由 "creat()" 生成的檔案的數字。此數字被程式中的其他系統呼叫用來訪問檔案。如果 "creat()" 呼叫遇到錯誤,它將返回檔案描述符值為 -1。

"檔名" 引數給出新檔案的所需檔名。 "許可權位" 給出檔案的 "訪問許可權"。檔案有三個

"許可權" 與之相關

  • 寫入許可權
  Allows data to be written to the file.
  • 讀取許可權
  Allows data to be read from the file.
  • 執行許可權
  Designates that the file is a program that can be run.

這些許可權可以為三個不同的級別設定

  • 使用者級別
  Permissions apply to individual user.
  • 組級別
  Permissions apply to members of user's defined "group".
  • 系統級別
  Permissions apply to everyone on the system.

對於 "creat()" 系統呼叫,許可權以八進位制表示,其中八進位制數字為每個許可權級別的三個許可權位給出許可權。在八進位制中,許可權設定

   0644

—授予使用者讀取和寫入許可權,但僅授予

組和系統讀取許可權。以下八進位制數字授予每個人所有許可權

   0777

嘗試 "creat()" 一個現有檔案(程式對該檔案具有寫入許可權)不會返回錯誤。它將改為擦除檔案的內容並返回該檔案的描述符。

例如,要建立一個名為 "data" 的檔案,該檔案對系統上的每個人都具有讀取和寫入許可權,需要以下語句

   #define RD_WR 0666
   ...
   int fd;                               /Define file descriptor. */
   fd = creat( "data", RD_WR );

"open()" 系統呼叫開啟一個現有檔案以供讀取或寫入。它有以下語法

   <file descriptor variable> = open( <filename>, <access mode> );

"open()" 呼叫與 "creat()" 呼叫類似,因為它返回給定檔案的描述符,並在遇到錯誤時返回描述符 -1。但是,第二個引數是 "訪問模式",而不是許可權程式碼。有三種模式(在 "fcntl.h" 標頭檔案中定義)

   O_RDONLY    Open for reading only.
   O_WRONLY    Open for writing only.
   O_RDWR      Open for reading and writing.

例如,要開啟 "data" 以供寫入,假設該檔案是由另一個程式建立的,將使用以下語句

   int fd;
   fd = open( "data", O_WRONLY );

在繼續之前,還要補充幾點

  • "creat()" 呼叫隱含 "open()"。無需 "creat()" 一個檔案,然後 "open()" 它。
  • 作業系統有一個對程式在任何時候可以開啟的檔案數量的限制。
  • 檔案描述符不過是一個任意數字,程式使用它來區分一個開啟的檔案和另一個檔案。當檔案關閉時,重新開啟它可能不會再給它相同的描述符。

"close()" 系統呼叫非常簡單。它所做的就是當不再需要訪問檔案時 "關閉" 一個開啟的檔案。 "close()" 系統呼叫有以下語法

   close( <file descriptor> );

"close()" 呼叫如果成功,將返回 0,如果遇到錯誤,將返回 -1。

"unlink()" 系統呼叫刪除檔案。它有以下語法

   unlink( <file_name_string> );

它在成功時返回 0,在失敗時返回 -1。注意:即使在 unlink 後,您仍然可以使用 fd 讀取/寫入。

"write()" 系統呼叫將資料寫入開啟的檔案。它有以下語法

   write( <file descriptor>, <buffer>, <buffer length> );

檔案描述符由 "creat()" 或 "open()" 系統呼叫返回。 "緩衝區" 是指向包含資料的變數或陣列的指標; "緩衝區長度" 給出要寫入檔案中的位元組數。

雖然不同資料型別在不同系統上的位元組長度可能不同,但可以使用 "sizeof()" 語句提供以位元組為單位的正確緩衝區長度。 "write()" 呼叫可以指定如下

   float array[10];
   ...
   write( fd, array, sizeof( array ) );

"write()" 函式返回它實際寫入的位元組數。它在錯誤時將返回 -1。

"read()" 系統呼叫從開啟的檔案中讀取資料。它的語法與 "write()" 呼叫完全相同

   read( <file descriptor>, <buffer>, <buffer length> );

"read()" 函式返回它實際返回的位元組數。在檔案末尾,它返回 0,或在錯誤時返回 -1。

華夏公益教科書