一些常用的系統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:檔案末尾處
- lseek函式可以將檔案位置調整到任意的位置,可以是已有資料的地方,也可以是未有資料的地方,假設調整到檔案末尾之後的某個地方,那麼檔案將會形成所謂“空洞”。
- lseek函式只能對普通檔案調整檔案位置,不能對管道檔案調整。
- lseek函式的返回值是調整後的檔案位置距離檔案開頭的偏移量,單位是位元組。