Linux学习笔记11——文件I/O之二
一、文件共享
內核使用三種數據結構表示打開的文件,它們之間的關系決定了在文件共享方面一個進程對另一個進程可能產生的影響。
1、每個進程在進程表中都有一個記錄項,記錄項中包含有一張打開文件描述表
2、內核為所有打開文件維持一張文件表
3、每個打開文件都有一個v節點結構,v節點包含了文件類型和對此文件進行各種操作的函數的指針。PS:Linux中沒有使用v節點,而是使用了通用i節點結構。
文件描述符標志只用于一個進程的一個描述符
文件狀態標志適用于指向該給定文件表項的任何進程中的所有描述符
?
二、原子操作
1、pread函數和pwrite函數
#include <unistd.h>
ssize_t pread(int fd, //要讀取數據的文件描述符
void *buf, //數據緩存區指針,存放讀取出來的數據
size_t nbytes, //讀取數據的字節數
off_t offset ?//讀取的起始地址的偏移量,讀取地址=文件開始+offset
); //返回值:讀到的字節數,若已到文件結尾則返回0,若出錯則返回-1
ssize_t pwrite(int fd, ? ?//要寫入數據的文件描述符
const void *buf, ??//數據緩存區指針,存放要寫入文件中的數據
size_t nbytes, //寫入數據的字節數
off_t offset ?//寫入起始地址的偏移量,寫入地址=文件開始+offset
); //返回值:若成功則返回已寫的字節數,若出錯則返回-1
調用pread相當于順序調用lseek和read,但是調用pread時,無法中斷其定位和讀操作,且不更新文件指針。
調用pwrite相當于順序調用lseek和write。
2、原子操作指的是由多步組成的操作,如果該操作原子地執行,則要么執行完所有步驟。要么一步也不執行,不可能只執行所有步驟的一個子集。
?
三、dup和dup2函數
#include <unistd.h>
int dup(int fd); //返回的新文件描述符一定是當前可用文件描述符的最小數值
int dup2(int fd,int fd2); ??//用fd2參數指定新描述符的數值
兩個函數都可用來復制一個現存的文件描述符,兩函數的返回值:若成功則返回新的文件描述符,若出錯則返回-1。
這兩個函數的用處:返回的新文件描述符與參數fd共享一個文件表項,達到共享一個文件狀態標志(讀、寫、添加等)以及同一當前文件偏移量。如下圖所示:
?
四、sync、fsync和fdatasync函數
雖然延遲寫減少了磁盤讀寫次數,但是卻降低了文件內容的更新速度,使得欲寫到文件中的數據在一段時間內并沒有寫到磁盤上。當系統發生故障時,這種延遲可能造成文件更新內容的丟失。sync、fsync和fdatasync函數可以保證磁盤上實際文件系統與緩沖區高速緩存中內存的一致性。
#include <unistd.h>
int fsync(int fd);
int fdatasync(int fd); //這兩個函數的返回值:若成功則返回0,若出錯則返回-1
void sync(void);
fsync :只對由文件描述符fd指定的單一文件起作用,并且等待寫磁盤操作結束,然后返回
fdatasync :只影響文件的數據部分,而除數據外,fsync還會同步更新文件的屬性
sync :只是將所有修改過的塊緩沖區排入寫隊列,然后就返回,它并不等待實際寫盤操作結束
五、fcntl函數
#include<fcntl.h>
int fcntl(int fd,int cmd,int arg); //返回值:若成功則依賴于cmd,若出錯則返回-1
?
fcntl函數有5種功能: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
轉載于:https://www.cnblogs.com/mengfanxiao/p/4479745.html
總結
以上是生活随笔為你收集整理的Linux学习笔记11——文件I/O之二的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kibana安装配置
- 下一篇: linux生成证书