首頁 > 軟體

Linux/Unix中系統級IO

2020-06-16 17:55:58

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


IT145.com E-mail:sddin#qq.com