2021-05-12 14:32:11
Linux/Unix中系統級IO
Linux/Unix I/O:將裝置對映為檔案的方式,允許Unix核心引出一個簡單、低階的應用介面。
Linux/Unix IO的系統呼叫函數很簡單,它只有5個函數:open(開啟)、close(關閉)、read(讀)、write(寫)、lseek(定位)。但是系統IO呼叫開銷比較大,一般不會直接呼叫,而是通過呼叫Rio包進行健壯地讀和寫,或者呼叫C語言的標準I/O進行讀寫。儘管如此,Rio包和標準IO也都是封裝了unix I/O的,所以學習系統IO的呼叫才能更好地理解高階IO的原理。
1、開啟檔案 返回一個小的非負整數,即描述符。用描述符來標識檔案。每個進程都有三個開啟的檔案:標準輸入(0)、標準輸出(1)、標準錯誤(2)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(char *filename, int flags, mode_t mode);
//返回:若成功則為新檔案描述符,若出錯為-1
flags:進程打算如何存取檔案
O_RDONLY:唯讀 O_WRONLY:只寫 O_RDWR:可讀可寫
也可以是一個或更多位掩碼的或:
O_CREAT:如檔案不存在,則建立
O_TRUNC:如果檔案已存在,則截斷
O_APPEND:每次寫操作,設定k到檔案結尾
mode:指定新檔案的存取許可權位
每個進程都有一個umask,通過呼叫umask函數設定。所以檔案的許可權為被設定成mode & ~umask
2、改變當前檔案位置 從檔案開頭起始的位元組偏移量。系統核心保持一個檔案位置k,對於每個開啟的檔案,起始值為0。應用程式執行seek,設定當前位置k,通過呼叫lseek函數,顯示地修改當前檔案位置。
3、讀寫檔案。讀操作:從檔案拷貝n個位元組到記憶體,從當前檔案位置k開始,將k增加到k+n,對於一個大小為m位元組的檔案,當k>=m時,讀操作觸發一個EOF的條件。寫操作:從記憶體拷貝n個位元組到檔案,k更新為k+n
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t n);
//返回:若成功則為讀的位元組數,若EOF則為0,若出錯為-1.
ssize_t write(int fd, const void *buf, size_t n);
//返回:若成功則為寫的位元組數,若出錯則為-1.
read函數:從描述符為fd的當前檔案位置拷貝至多n個位元組到記憶體位置buf。返回-1表示一個錯誤,返回0表示EOF,否則返回實際讀取的位元組數。
write函數:從記憶體位置buf拷貝至多n個位元組到描述符fd的當前檔案位置。
Ps:ssize_t與size_t區別:size_t:unsigned int,ssized_t:int。
4、關閉檔案:核心釋放檔案開啟時建立的資料結構,並恢復描述符到描述符池中,進程通過呼叫close函數關閉一個開啟的檔案。關閉一個已關閉的描述符會出錯。
#include <unistd.h>
int close(int fd);
//返回:若成功則為0,若出錯則為-1.
本文永久更新連結地址:http://www.linuxidc.com/Linux/2015-08/121241.htm
相關文章