APUE讀書筆記——文件IO

一、五個函數:

open/read/write/lseek/close

二、文件描述符

對內核而言,每個打開文件都是通過文件描述符(其實就是一個非負整數)引用。慣例0標準輸入、1標準輸出、2標準出錯

三、open函數

打開或者創建文件

#include<fcntl.h>

int open(const char *pathname, int oflag, …/*mode_t mode*/)

返回值:成功返回文件描述符,出錯返回-1;返回的一定是最小未用的描述符

oflag:O_RDONLY      O_WRONLY      O_RDWR

可選:O_APPEND;O_CREAT; O_EXCL; O_TRUNC; O_NOCTTY; O_NONBLOCK

四、creat函數

創建文件

#include<fcntl.h>

int creat(const char *pathname, mode_t mode)

返回值:成功返回只寫打開的文件描述符,出錯返回-1;

等效於open(pathname,O_WRONLY|O_CREAT|O_TRUNC,mode)

五、close函數

關閉一個打開的文件

#include<unistd.h>

Int close(int filedes)

返回值:成功返回0,出錯返回-1

關閉文件時,進程會釋放加在該文件上的記錄鎖

進程結束是會釋放掉所有打開的文件

六、lseek函數

每個打開的文件都有一個當前文件偏移量(current file offset)——從文件開始處的字節數

#include<unistd.h>

off_t lseek(int filedes, off_t offset, int whence)

返回值:成功返回新的文件偏移量,出錯-1;

whence:SEEK_SET; SEEK_CUR; SEEK_END

(負文件偏移量)

七、read函數

從打開的文件讀數據

#include<unistd.h>

ssize_t read(int filedes, void *buf, size_t nbytes)

返回值:成功返回讀取的字節數,已到文件結尾0,錯誤-1;

八、write函數

向打開的文件寫數據

#include<unistd.h>

ssize_t write(int filedes, const void *buf, size_t nbytes)

返回值:成功返回已寫的字節數,出錯-1;

寫成功後,文件偏移量增加實際寫的字節數。

九、文件共享

對於已經打開的文件,內核有三種數據結構表示它:

每個進程都有個進程表項

(1)      文件描述符表

文件描述符標誌

指向文件表項的指針

(2)      文件表項

文件狀態標誌

當前文件偏移量

指向v結點的指針

(3)      v結點

打開文件的內核結構

        

                   兩個獨立進程打開同一個文件

每個給定文件只有一個v結點表項,而每個進程都有自己的文件表項:這種安排使每個進程都可以有自己對該文件的當前文件偏移量

十、原子操作

多個進程讀同一個文件都能正確工作,但是同時寫一個文件就會出現意想不到的結果,因爲每個進程都有自己的文件表項,裏面存有自己的當前文件偏移量。爲了避免這種情況,就需要原子操作。

#include<unistd.h>

ssize_t pread(intfiledes, void *buf, size_t nbytes, off_t offset)

返回值:成功返回讀到的字節書,到文件末尾0,出錯-1;

ssize_t pwrite(intfiledes, void *buf, size_t nbytes, off_t offset)

返回值:成功返回寫的字節數,出錯-1;

十一、dup和dup2函數

                   複製一個現存的文件描述符

                   #include<unistd.h>

                   int dup(int filedes)

                   int dup2(int filedes, intfiledes2)

                   返回值:成功返回新的文件描述符,出錯-1;

dup返回的一定是當前可用的最小的文件描述符,dup2是用filedes2指定新的文件描述符,如果filedes2已經打開,則先將其關閉。

十二、sync、fsync、fdatasync函數

                   爲了保證磁盤上實際文件系統與緩衝區高速緩存中的內容一致性

十三、fcntl函數

                   改變已打開文件的性質

                   #include<fcntl.h>

                   int fcntl(int filedes, intcmd, …/*int arg*/)

                   fcntl5種功能:

1、  複製一個現有的描述符(cmd= F_DUPFD)

2、  獲得/設置文件描述符標記(cmd= F_GETFD /F_SETFD)

3、  獲得/設置文件狀態標誌(cmd= F_GETFL/F_SETFL)

4、  獲得/設置異步I/O所有權(cmd =F_GETOWN/F_SETOWN)

5、  獲得/設置記錄所(cmd =F_GETLK/F_SETLK/F_SETLKW)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章