在linux中,為了保護核心空間,將程式的執行空間分為核心空間和使用者空間,(核心態和使用者態),他們執行在不同的級別上,在邏輯上是相互隔離的,因此使用者程序在通常情況下不允許訪問核心資料,也無法使用核心函式,他們只能在使用者空間操作使用者資料,呼叫使用者空間的函式,作業系統為使用者提供了兩個介面:
1.乙個是使用者程式設計介面api,使用者利用這些操作命令來組織和控制任務的執行或管理計算機系統,
2.另乙個介面是系統呼叫,程式設計人員使用系統呼叫來請求作業系統提供服務。
系統呼叫包括:
程序控制、
檔案系統控制、
系統控制、
記憶體管理、
網路管理、
socket控制、
使用者管理、
程序間通訊8個模組
linux中檔案分為4種,
普通檔案、目錄檔案、鏈結檔案、裝置檔案
要區分這些檔案就要了解「檔案描述符」
檔案描述符是乙個非負的整數,他是乙個索引值,並指向核心中每個程序開啟檔案的記錄表。當開啟乙個現存盤案或建立乙個新檔案時,核心就向程序返回乙個檔案描述符,當需要讀/寫檔案時,也需要把檔案描述符作為引數傳遞給相應的函式。
通常,乙個程序啟動時,都會開啟3個檔案,標準輸入,標準輸出,標準出錯處理,這3個檔案描述符為0、1和2
也就是巨集替換stdin_fileno
stdout_fileno
stderr_fileno
基本i/o操作
linux的輸入/輸出(i/o)操作,通常為5個方面:
開啟,讀取,寫入,定位,和關閉
對應的有5個系統呼叫:
open,read,write,lseek,close
這5個函式也稱為不帶緩衝區的i/o操作,程式設計師可以直接操作硬體,其原型如下:
#include
#include
#include
#include
int open( const char * pathname, int flags, mode_t mode);
ssize_t read(int fd, void *buf, size_t nbytes);
ssize_t write(int fd, const void *buf, size_t nbytes);
off_t lseek(int fd, off_t offset, int whence);
int close(int fd)
1.open函式
open函式的原型如下:
int open(const char *pathname, int flags)
int open(const char *pathname, int flags, mode_t mode)
函式傳入引數含義如下:
pathname:為字串,表示被開啟的檔名稱,可以包含路徑。
flags :為乙個或多個標誌,表示檔案的開啟方式,常用標誌如表所示:
o_rdonly 唯讀方式開啟
o_wronly 只寫方式開啟
o_rdwr 讀/寫方式開啟
o_creat 如果檔案不存在,就建立新的檔案
o_excl 如果使用o_creat時檔案存在,則可返回錯誤訊息
o_trunc 如果檔案已存在,且以唯讀或只寫成功開啟,則先全部刪除檔案中原有的資料
注意:在open函式中,flags引數可以用過「|」組合而成,o_rdonly,o_wronly,o_rdwr這三種方式是互斥的,不可同時使用,因此這3個引數只能出現乙個。
mode 被開啟檔案的訪問許可權模式,可以使用八進位制數來表示新檔案的許可權,也可以採用中定義的符號常量,當開啟已有檔案時,將忽略這個引數,函式返回值:成功則返回檔案描述符,出錯返回-1。
檔案模式符號常量:
s_irwxu 00700 所屬使用者讀。寫和執行許可權
s_irusr 00400 所屬使用者讀許可權
s_iwusr 00200 所屬使用者寫許可權
s_ixusr 00100 所屬使用者執行許可權
s_irwxg 00070 組使用者讀,寫和執行許可權
s_irgrp 00040 組使用者讀許可權
s_iwgrp 00020 組使用者寫許可權
s_ixgrp 00010 組使用者執行許可權
s_irwxo 00007 其他使用者讀,寫和執行許可權
s_iroth 00004 其他使用者讀許可權
s_iwoth 00002 其他使用者寫許可權
s_ixoth 00001 其他使用者執行許可權
2.read和write函式
函式原型如下:
ssize_t read(int fd, void *buf,size_t count)
ssize_t write(int fd,const void *buf, size_t count)
函式傳入引數含義如下:
fd 檔案描述符
buf 指定儲存器獨處資料的緩衝區
count 指定讀出或寫入的位元組數
函式返回值:如果發生錯誤,那麼返回值為-1,同時設定errno變數為錯誤**,如果操作成功,則返回值是實際讀取或寫入的位元組數,這個位元組數可能小於要求的位元組數count,對於讀操作而言,當檔案所剩的位元組數少於count時,就會出現這種情況,而對於寫操作來說,當磁碟已滿或者某些別的問題時,也會出現這種情況。
由於每次讀/寫的位元組數是可以設定的,即使每次讀取或寫入一位元組也是可以的,但是在資料量比較大時,這樣做會比一次讀取大塊資料付出的代價高很多,因此在使用這2個函式時應該盡量採取塊讀/寫的方式,提高i/o的效率。
3.close函式
當使用完檔案時可以使用close關閉檔案,close會讓緩衝區中的資料寫回磁碟,並釋放檔案所佔的資源,close的原型如下:
int close(int fd)
函式傳入引數:fd檔案描述符
函式返回值:若檔案順利關閉則返回0,發生錯誤則返回-1,並置errno,通常檔案在關閉時出錯是不常見的,但也不是不可能的情況,他別是在關閉通過網路訪問的檔案時就會出現這種情況。
/***fileio.c***/
#include#include#include#include#includeint main(void)
write( fd, s, sizeof(s) );/*向該檔案中寫入乙個字串*/
close(fd);
fd = open("temp.log", o_rdonly );
if(-1 == fd )
/*讀取檔案內容儲存到buffer指定的字串陣列中,返回讀取的字元個數*/
size = read( fd, buffer, sizeof(buffer) );
close( fd );
printf("%s",buffer);
return 0;
}
2.7.3 標準i/o操作
Linux 系統程式設計學習 檔案I O操作
一 非緩衝檔案操作 執行非緩衝檔案操作後,應用程式將立即獲取或傳送資料,非緩衝檔案操作的函式只有 read write 從檔案中將資訊講到到指定的記憶體區域中read 檔案識別符號,記憶體塊指標,記憶體塊長度 返回值是實際讀取的長度,沒有讀取到資料返回0,錯誤返回1 檔案識別符號可使用open 函式...
Python學習 檔案操作IO
開啟檔案 以讀檔案模式開啟乙個檔案物件,使用open 函式,傳入檔名和標示符 file open e python.txt r 注意 路徑符號不能用 而是 讀檔案 f.read aaaa nbbb nbccc nddd neee nfff nhhh n 注意 read 會一次性讀取檔案的全部內容,如...
Linux學習 檔案
chmod 更改檔案9個屬性 linux檔案屬性有兩種設定方法,一種是數字,一種是符號。linux檔案的基本許可權就有九個,分別是owner group others三種身份各有自己的read write execute許可權。先複習一下剛剛上面提到的資料 檔案的許可權字元為 rwxrwxrwx 這...