• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Linux----基礎I/O

    標簽: Linux  io

    回顧C文件接口


    寫文件

    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    #include<unistd.h>
    #include<string.h>
    int main ()
    {
        umask(0);
        int fd = open("myfile",O_WRONLY|O_CREAT,0644);
        if(fd < 0)
        {
            perror("open");
            return 1;
        }
        int count = 5;
        const char *msg = "hello world!\n";
        int len = strlen(msg);
        while(count--)
        {
            write(fd,msg,len);
        }
        close(fd);
        return 0;
    }

    這里寫圖片描述

    讀文件

    #include<stdio.h>
     #include<sys/types.h>
     #include<sys/stat.h>
     #include<fcntl.h>
     #include<unistd.h>
     #include<string.h>
      int main (){
         umask(0);
         int fd = open("myfile",O_WRONLY);
         if(fd < 0){
             perror("open");
             return 1;
         }
         int count = 5;
         const char *msg = "hello world!\n";
        char buf[1024];
         while(1){
             ssize_t s = read(fd,buf,strlen(msg));//類比write
             if(s > 0){
                 prin![這里寫圖片描述](https://img-blog.csdn.net/20180529134822775?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3OTM0MTAx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)tf("%s",buf);
             }
             else{
                 break;
             }
          }
         close(fd);
         return 0;
     }
    

    open接口

     #include<sys/types.h>
     #include<sys/stat.h>
     #include<fcntl.h>
    
     int open(const *pathname,int flags);
     int open(const *pathname,int flags,mode_t mode);

    pathname:要打開或創建的目標文件。
    flags:打開文件時,可以傳入多個參數選項,用下面的一個或多個常量進行“或”運算,構成flags。
    參數

    • O_RDONLY:只讀打開
    • O_WRONLY:只寫打開
    • O_RDWR:讀,寫打開
      這三個常量,必須指定一個且只能指定一個
    • O_CREAT:若文件不存在,則創建它。需要使用mode選項,來指明新文件的訪問權限
    • O_APPEND:追加寫

    返回值:

    • 成功:新打開的文件描述符
    • 失敗:-1

    open函數返回值


    系統函數庫函數

    • fopen fclose fread fwrite 都是C標準庫中的函數,稱之為庫函數
    • open close read write都是屬于系統提供的接口,稱之為系統調用接口

    可以認為,f#系列的函數,都是對系統調用的封裝,方便二次開發。

    文件描述符fd

    Linux進程默認情況下會有3個缺省打開的文件描述符,分別是標準輸入0標準輸出1標準錯誤2

    0,1,2對應的物理設備一般是:鍵盤,顯示器,顯示器。
    這里寫圖片描述

    文件描述符就是從0開始的小整數。當我們打開文件時,操作系統下內存中要創建相應的數據結構來描述目標文件。于是就有了file結構體,表示一個已經打開的文件對象。而進程執行open系統調用,所以必須讓進程和文件關聯起來。每個進程都有一個指針*file,指向一張表files_struct,該表最重要的部分就是包含一個指針數組,每個元素都是一個指向打開文件的指針。所以,本質上文件描述符就是該數組的下標。所以,只要拿著文件描述符,就可以找到對應的文件。

    文件描述符分配規則

    int main()
    {
        int fd = open("myfile", O_RDONLY);//只讀方式打開
        if(fd < 0)
           {
                  perror("open");
                  return 1;
           }
           printf("fd: %d\n",fd);
    
           close(fd);
           return 0;
    }

    這里寫圖片描述
    在代碼的最開始加入代碼close(0) 在運行發現結果變換成了這里寫圖片描述
    由此可見:在file_struct數組當中,找到當前沒有被使用的最小的一個下標,作為新的文件描述符。

    FILE


    • 因為IO相關函數與系統調用接口對應,并且庫函數封裝系統調用,所以本質上,訪問文件都是通過fd訪問的。
    • 所以C庫當中的FILE結構體中,一定封裝了fd。

    文件系統


    通過ls -l可以看到文件元數據
    這里寫圖片描述
    每行包含7列:

    • 模式
    • 硬鏈接數
    • 文件所有者
    • 大小
    • 最后修改時間
    • 文件名

    ls -l讀取存儲在磁盤上的文件信息,然后顯示出來。還可以使用stat來顯示單個文件的信息。
    這里寫圖片描述

    inod

    這里寫圖片描述

    • 超級塊:存放文件系統本身的結構信息
    • i節點表:存放文件屬性(文件大小,所有者,最新修改時間等)
    • 數據區:存放文件內容

    將屬性與數據分開存放的想法看起來簡單,但是是怎么操作的呢?
    這里寫圖片描述

    創建一個新文件主要有以下四個操作:
    1. 存儲屬性:內核先找到一個空閑的i節點(這里是263466)。內核把文件信息記錄到其中。
    2. 存儲數據:該文件需要在三個磁盤塊,內核找到了三個空閑塊300,500,800。將內存緩沖區中的內容依次寫入。
    3. 記錄分配情況:文件內容按300,500,8,,順序存放。內核在inode上的磁盤分布區記錄了上述塊列表。
    4. 添加文件名到目錄:新的文件名abc。內核將入口(263466,abc)添加到目錄文件。文件名和inode之間的對應關系將文件名和文件的內容及屬性連接起來。

    硬鏈接

    這里寫圖片描述

    • a和b的連接狀態完全相同,他們被稱為指向文件的硬鏈接。內核記錄了這個連接數,inode 71178543的硬連接數為2。
    • 在刪除文件時:1. 在目錄中將對應的記錄刪除 2.將硬連接數-1,如果為零,則將對應的磁盤釋放。

    軟連接

    硬鏈接通過inode引用另一個文件,軟連接通過名字引用另一個文件
    這里寫圖片描述

    版權聲明:本文為qq_37934101原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_37934101/article/details/80495323

    智能推薦

    補 I/O基礎

    1.system.in,system.out示范 2.fileInputStream,fileOutPutStream用法 3.DateInPutStream,DateOutPutStream用法 4.Objectstream用法 5.fileCopy...

    基礎I/O

    基礎I/O,也就是輸入/輸出。下面介紹一些常用的文件操作函數。 1. fopen( ) / fclose( ) 這兩個函數每次都是結伴出現,用fopen打開文件,用close關閉文件。 在結尾位置將文件關閉 fclose(fp); 2. 輸出函數 a. printf(“%s”,msg); 將字符串msg輸出到顯示器上 b. fprintf(stdout,msg); 將字符串...

    數組刪除其中某個對象的方法

    數組刪除其中的對象或元素,在前端是比較常見的需求。 我現在比較常用的方法如下: 這種方法只適合刪除具有唯一標識的對象。 有沒有想要脫單的小伙伴,加入我們的脫單星球,認識更多優秀的小哥哥小姐姐 特此聲明,星球是免費的,但是創建星球的時候說是必須輸入金額,所以只能先私聊,我再加你免費加入!...

    圖床搭建以及圖床工具的使用

    為什么要用圖床和圖床工具? 比較下面三種md中的圖片url地址(均免費),你會使用哪一種? 選1?由于是本地路徑,文檔分享后給其他人打開后很可能顯示圖片加載失敗。 選2?雖然分享后可以顯示圖片,但能保證加載速度? 選3?我肯定選這種,即兼容2的瀏覽器訪問,又能保證訪問速度。 這樣就可以回答上面的問題了!保證瀏覽器訪問要用圖床,保證加載速度要用圖床工具,又不花錢想想就開心。 除此之外本篇博客還會講解...

    并發編程理論篇

    一、必備知識回顧 計算機又叫電腦,即通電的大腦,發明計算機是為了讓他通電之后能夠像人一樣去工作,并且它比人的工作效率更高,因為可以24小時不間斷 計算機五大組成部分 控制器 運算器 存儲器 輸入設備 輸出設備 計算機的核心真正干活的是CPU(控制器+運算器=中央處理器) 程序要想被計算機運行,它的代碼必須要先由硬盤讀到內存,之后cpu取指再執行 并發 看起來像同時運行的就可以稱之為并發 并行 真正...

    猜你喜歡

    Java LinkedHashMap

    Java LinkedHashMap 前言 Map是我們在實際使用過程中常用的集合,HashMap在Java的實際開發中出鏡率很高,它通過hash算法實現了高效的非線程安全的集合,它有一個缺點就是,用戶插入集合的數據時無序,在我們需要一些有序的map的時候,我們就需要引入另外一個集合:LinkedHashMap。 LinkedHashMap是一個有序的非線程安全的集合,它是HashMap的子類,基...

    Spark Streaming處理文件(本地文件以及hdfs上面的文件)

    標題介紹文件流之前先介紹一下Dstream 下面是來自官網一段的說明,Discretized Streams或DStream是Spark Streaming提供的基本抽象。它表示連續的數據流,可以是從源接收的輸入數據流,也可以是通過轉換輸入流生成的已處理數據流。在內部,DStream由一系列連續的RDD表示,這是Spark對不可變的分布式數據集的抽象(有關更多詳細信息,請參見Spark編程指南)。...

    《痞子衡嵌入式半月刊》 第 8 期

    痞子衡嵌入式半月刊: 第 8 期 這里分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農歷年分二十四節氣,希望在每個交節之日準時發布一期。 本期刊是開源項目(GitHub: JayHeng/pzh-mcu-bi-weekly),歡迎提交 issue,投稿或推薦你知道的嵌入式那些事兒。 上期回顧 :《痞子衡嵌入式半月刊: 第 7 期》 嘮兩句 今天是小滿,小滿節氣意味著進入了大幅降水的雨季。痞子...

    (C++)二叉樹的線索化 / 線索二叉樹

    好久不見,朋友們!雖然我知道沒人看我的博客,但我還是想叨逼叨一下。啊,好久沒編程了(其實也就一周沒編),但你們知道,程序員一天不編程那能叫程序員么???雖然我不是程序員哈哈哈哈哈,但還是要有基本素養嘛。 繼續寫二叉樹,給自己立一個flag,就是這幾天要寫完之前沒做完的幾道題,和二叉樹紅黑樹各種樹之類的~~雖然有這個flag,但我還是很實誠地遵從自己的內心,買了一張明天的電影票,等我回來告訴你們好不...

    Linux內存管理:分頁機制

    《Linux內存管理:內存描述之內存節點node》 《Linux內存管理:內存描述之內存區域zone》 《Linux內存管理:內存描述之內存頁面page》 《Linux內存管理:內存描述之高端內存》 《Linux內存管理:分頁機制》 《內存管理:Linux Memory Management:MMU、段、分頁、PAE、Cache、TLB》 目錄 1 分頁機制 1.1 為什么使用多級頁表來完成映射 ...

    精品国产乱码久久久久久蜜桃不卡