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