歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux/Unix中系統級IO

Linux/Unix中系統級IO

日期:2017/2/28 13:59:19   编辑:Linux教程

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.

Copyright © Linux教程網 All Rights Reserved