常用系統io

do泽發表於2024-08-10

一些常用的系統io基礎

系統IO基本概念

​ 由於Linux系統下的“一切皆檔案”,即Linux系統下的資料和程式均以檔案形式儲存。因而Linux核心提供了一組操作檔案的函式介面,通常被稱為系統io

系統io基本API

open

標頭檔案:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

函式原型:

int fd = int open(const char *pathname,int flags);
int fd = int open(const char *pathname,int flags,mode_t mode);

成功返回檔案描述值(大於0的整數),失敗返回-1;

功能:開啟指定檔案並獲得一個檔案描述符,或者創造一個新檔案

同一個檔案可以被多次開啟

檔案描述值:每開啟一次檔案就產生一個檔案描述值(0、1、2被佔用,分別為標準輸入、標準輸出、標準出錯)

pathname為即將要開啟的檔案,mode 為即將建立的檔案的許可權(八進位制);

flags所代表的引數:(可以用位或的方式同時指定多個模式)

O_RDONLY:只讀方式開啟檔案

O_WRONLY:只寫方式開啟檔案

O_RDWR:讀寫方式開啟檔案

O_CREAT:如果檔案不存在,創造檔案

O_EXCL:如果O_CREAT創造檔案存在,返回錯誤訊息

O_NOCTTY:當檔案為終端時,阻止該終端成為程序的控制終端

O_TRUNC:當檔案已存在時,刪除檔案中原有資料

O_APPEND:以追加方式開啟檔案(需配合寫模式)

mode 所表示的檔案許可權(八進位制)

許可權 執行 執行 執行
字元表示 r w s r w s r w s
數字表示 4 2 1 4 2 1 4 2 1
許可權使用者 檔案所有者(usr) 檔案所屬組(group) 其他使用者(other)
數字模式組合介紹
777 7(讀、寫、執行) 7(讀、寫、執行) 7(讀、寫、執行)
755 7(讀、寫、執行) 5(讀、執行) 5(讀、執行)
644 6(讀、寫) 4(讀) 4(讀)

檔案描述值

開啟檔案時,核心會在未分配的檔案描述符中分配一個最小的給開啟的檔案,本質是一個非負整數。

開啟檔案時,核心會產生一個指向file{}的指標,並將該指標放入一個位於file_struct{}的陣列中,而該指標所在陣列的下標,被函式open 返回使用者,即為檔案描述符(int型)。

  • 檔案描述符從0開始,每開啟一個檔案,就產生一個新的檔案描述符。
  • 可以重複開啟同一個檔案,每次開啟檔案都會使核心產生系列結構體,並得到不同的檔案描述符
  • 由於系統在每個程序開始執行時,都預設開啟了一次鍵盤、兩次螢幕,因此0、1、2描述符分別代表標準輸入、標準輸出和標準出錯三個檔案(兩個硬體)。

close

標頭檔案:

#include <unistd>

函式原型:

int close (int fd);

成功返回0,失敗返回-1;

功能:關閉檔案並釋放相應資源。

重複關閉檔案或關閉尚未開啟的檔案是安全的(會有失敗返回)

read

標頭檔案:

#include <unistd.h>

函式原型:

size_t read (int fd,void * buf,size_t count);

成功返回讀到的位元組數,失敗返回-1;

fd :檔案描述值

buf :緩衝區

count :想要讀的位元組數

  • 引數count是讀寫位元組數的願望值,實際讀寫成功的位元組數由返回值決定。
  • 讀取普通檔案時,如果當讀到了檔案尾,read()會返回0。
  • 讀取管道檔案時,如果管道中沒有資料,read()預設會阻塞。

write

標頭檔案:

#include <unistd.h>

函式原型:

size_t write (int fd,const void * buf,size_t count);

成功返回寫入的位元組數,失敗返回-1;

fd :檔案描述值

buf :即將要寫入的資料

count :想要寫入位元組數

lseek

標頭檔案:

#include <unistd.h>
#include <sys/types.h>

函式原型:

off_t lseek  (int fd,off_t  offset,int whence);

成功返回新檔案位置偏移量,失敗返回-1;

fd :檔案描述值

offset:新位置偏移量相對於基準點偏移量(可正可負)

whence:

SEEK_SET:檔案開頭處

SEEK_CUR:當前位置

SEEK_END:檔案末尾處

  1. lseek函式可以將檔案位置調整到任意的位置,可以是已有資料的地方,也可以是未有資料的地方,假設調整到檔案末尾之後的某個地方,那麼檔案將會形成所謂“空洞”。
  2. lseek函式只能對普通檔案調整檔案位置,不能對管道檔案調整。
  3. lseek函式的返回值是調整後的檔案位置距離檔案開頭的偏移量,單位是位元組。

相關文章