一、檔案描述符
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...