日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux学习笔记11——文件I/O之二

發(fā)布時間:2023/12/18 linux 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux学习笔记11——文件I/O之二 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、文件共享

  內(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。