linux系統程式設計之檔案I O

2021-08-13 10:30:23 字數 2232 閱讀 1637

一、檔案描述符      

linux系統中,所有開啟的檔案都對應乙個數字,這個數字由系統來分配,稱為檔案描述符。

pcb程序控制塊裡有檔案描述符表,以陣列形式存放於核心區。

乙個程序預設開啟3個檔案描述符  stdin_fileno 0   stdout_fileno 1  stderr_fileno 2

新開啟檔案返回檔案描述符表中未使用的最小檔案描述符。

二、open函式

可以開啟或建立乙個檔案。

標頭檔案#include

#include

#include

函式原型

int open(const char *pathname, int flags);

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

返回值:成功返回新分配的檔案描述符,出錯返回-1並設定errno

三、read/write 函式

標頭檔案#include

函式原型

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

返回值:成功返回讀取的位元組數,出錯返回-1並設定errno,如果在調read之前已到達檔案末尾,則這次read返回0

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

返回值:成功返回寫入的位元組數,出錯返回-1並設定errno

四、阻塞與非阻塞

讀常規檔案是不會阻塞的,不管讀多少位元組,read一定會在有限的時間內返回。從終端裝置或網路讀則不一定,如果從終端輸入的資料沒有換行符,呼叫read讀終端裝置就會阻

塞,如果網路上沒有接收到資料報,呼叫read從網路讀就會阻塞,至於會阻塞多長時間也是不確定的,如果一直沒有資料到達就一直阻塞在那裡。同樣,寫常規檔案是不會阻塞的,而

向終端裝置或網路寫則不一定。

阻塞(block)

當程序呼叫乙個阻塞的系統函式時,該程序被置於睡眠(sleep)狀態,這時核心排程其它程序執行,直到該程序等待的事件發生了(比如網路上接收到資料報,或者呼叫sleep指定的睡眠時間到了)它才有可能繼續執行。與睡

眠狀態相對的是執行(running)狀態,在linux核心中,處於執行狀態的程序分為兩種情況: (1)正在被排程執行;(2)就緒狀態。

非阻塞i/o有乙個缺點,如果所有裝置都一直沒有資料到達,呼叫者需要反覆查詢做無用功,如果阻塞在那裡,作業系統可以排程別的程序執行,就不會做無用功了。

用非阻塞i/o實現等待超時,既保證了超時退出的邏輯又保證了有資料到達時處理延遲較小 。現給出**:

#include

#include

#include

#include

#include

#define msg_try "try again\n"

#define msg_timeout "timeout\n"

int main(void)

for(i=0; i<5; i++)

sleep(1);

write(stdout_fileno, msg_try, strlen(msg_try));

}if(i==5)

write(stdout_fileno, msg_timeout, strlen(msg_timeout));

else

write(stdout_fileno, buf, n);

close(fd);

return 0;

}五、lseek函式

標頭檔案   

#include

#include

函式原型

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

若lseek成功執行,則返回新的偏移量。

六、fcntl

可以用fcntl函式改變乙個已開啟的檔案的屬性,可以重新設定讀、寫、追加、非阻塞等標誌(這些標誌稱為file status flag),而不必重新open檔案。

標頭檔案#include

#include

函式原型

int fcntl(int fd, int cmd);

int fcntl(int fd, int cmd, long arg);

int fcntl(int fd, int cmd, struct flock *lock);

linux系統程式設計之檔案IO

1.開啟檔案的函式open,第乙個引數表示檔案路徑名,第二個為開啟標記,第三個為檔案許可權 效果測試 列印開啟檔案返回的描述符為3,同時建立了檔案testopen1 2.建立檔案函式creat和關閉函式close 使用 include include include includeint main ...

linux系統程式設計之檔案IO(一)

在linux中,一切皆檔案,想對檔案內容進行操作,除了有操作許可權外,更重要的一點是要開啟檔案。以下只有乾貨 1 系統呼叫 include include include int open const char name,int flags int open const char name,int ...

Linux系統程式設計之檔案程式設計

目錄 一 檔案程式設計 1 linux檔案 2 檔案描述符 file descriptor 3 常用api open write read lseek close 1 open 開啟檔案函式 2 close 關閉檔案 3 write 寫檔案 4 read 讀檔案 5 lseek 游標定位 linux...