操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    全文目錄

    一、基本要求介紹

    目標

    形式要求

    實現約束

    二、解決方法思路

    ?參考文章

    主體實現思路

    三、linux系統調用簡介

    open & close

    write & read

    lseek

    四、磁盤組織方式簡介

    文件訪問的過程

    五、主函數實現

    提示信息的輸出

    類終端功能實現

    六、文件功能定義

    主要數據結構

    創建文件系統

    格式化

    低級格式化

    創建文件

    刪除文件

    七、寫在最后

    一、基本要求介紹目標

    完成用戶態環境下的磁盤模擬功能,提供磁盤基本信息查詢與格式化功能。

    形式要求

    基于C/C++,完成上述完整功能

    實現約束

    利用一個大文件(128MB)來模擬磁盤塊設備,基于固定分片大小實現文件系統的超級塊區、inode節點區、數據分片區的管理,具備磁盤格式化、文件系統查詢(如:fdisk -l)功能,支持文件的inode節點和對應數據分片的分配、回收。

    注:此為樓主的一次linux作業,鑒于還沒到提交作業的截至日期,所以如果你 借鑒 此篇文章,請修改一定量以防大家都沒分數0.0

    二、解決方法思路

    拿到一道要求時,最重要的是學會找資源,找到一些思路,然后自己去做實現。

    所以我平時很喜歡問思路的同學,但是知道思路還不知道代碼怎么寫呢,我就覺得這是態度問題了,希望大家還是只借鑒思路,千萬別直接復制粘貼,這對自己一點好處都沒有。

    ?參考文章

    1.文件系統簡單模擬

    這篇文章實現的功能非常復雜,所以我只是借鑒了主程序的寫法,主要是給自己做一個主程序的基礎架構。

    2.ext2文件系統詳解

    這篇文件非常詳細的介紹了ext2文件系統的實現方式,這是已有的真實文件系統的結構,我們可以對其進行適當的精簡,做出我們的想要的功能。

    主體實現思路模塊框架設計

    分片大小:4KB 則一共有32K(128M/4K)個分片

    保留區:三個分片,分別為超級塊,inode位示圖,數據區位示圖

    inode節點:128B,每個分片有32個inode節點,32K個分片需要1K個分片保存inode節點信息,分配inode節點區為4MB。

    對應的分配方式如下圖

    c 讀取文件多行文本_c中刪除文本文件_c中刪掉文件夾中所有文件

    主程序設計

    做一個類似于終端的執行方式,輸入相應的命令執行相應的操作。

    基本的效果如下

    三、linux系統調用簡介

    為了細化上面提到一些細節實現,我們需要了解linux的對文件的系統調用。這部分有點枯燥,畢竟都是系統調用函數,但是也不多,熟悉這部分的同學直接跳過啦0.0

    open & close

    int open (const char *name, int flags, mode_t mode);
    int close(int fd);

    上面對應的就是打開和open和close系統函數定義

    其中open有三個傳入參數

    第一個就很好理解就是文件名稱

    第二個是flags表示打開方式,這次用到的只有三個 、、

    分別表示如果不存在就創建,只讀和只寫。其中如果我想獲取讀寫權限可以用 | 來表示。

    第三個參數我是再第二個參數有時候使用,是定義文件的權限的。因為是為了學習,我就簡單的定義的所有人可讀可寫可執行||。

    返回值是文件描述符,表示在文件打卡表項的位置(在內存中,保存著打開文件的位置信息),是系統為我們維護的方便使用的一個符號。如果返回-1表示打開失敗

    相對來說close就簡單很多

    只有一個傳入參數 就是open的返回值文件描述符,是一個大于等于0的整數可以看下圖

    write & read

    size_t read(int fd, void *buf, size_t count);
    size_t write(int filedes,const char* buf,size_t nbytes);

    這兩個函數很類似,只不過功能一個是讀一個是寫,我就放在一起講了。都有三個參數

    第一個參數是一個文件打開表項,其實就是我們剛才說的open返回值。

    第二個是一個指針,如果忽略他的類型可以理解為一片內存空間,其中read就是往這片空間寫入數據,wirte就是將對應的空間的數據寫入文件。

    第三個數據是讀或者寫的數據大小,單位是字節。千萬別超過第二個參數中指針指向的數據大小,不然會寫入未知內存,造成程序未知錯誤,建議直接就(第二個元素)

    這兩個函數可以說對于c語言指針的使用極度舒適,直接操作內存。

    需要注意一個點就是每次讀寫系統會將我們的文件偏移量往后推移讀到元素個數

    lseek

    #include 
    #include 
    off_t lseek(int fd, off_t offset, int whence);

    上面說到每次read和wirte都會推進文件偏移量。所以為了改變文件偏移量,我們就有了這個函數。

    第一個參數還是文件打開表項,就是open返回那個

    第二個參數就是偏移量。單位是字節,可前可后,所以就可以正也可以負值。

    第三個參數是相哪里的位置 有三個可選項、、,分別表示相對文件頭、相對當前位置以及相對文件末尾。我們只需要前兩個就好了。

    上面就是所有需要的基本系統調用函數,接下來介紹一些燒腦的文件結構。

    四、磁盤組織方式簡介

    圖片是一個常見的文件系統的圖片,我們需要實現的只有單分區就好了,不那么復雜。

    這張圖就是一個最簡單的文件系統,但是作業要求我們有inode和數據塊的分配回收,所以我們得加上inode位示圖和數據塊的位示圖。

    文件訪問的過程

    當我們嘗試訪問一個文件\123\456.txt的時候基本過程是

    從這個過程中我們知道

    c 讀取文件多行文本_c中刪除文本文件_c中刪掉文件夾中所有文件

    超級塊(一般是第一塊)

    主要保存文件系統的基本信息,數據分片的大小、inode節點大小和多少c中刪除文本文件,根目錄的位置等

    inode節點

    **文件的基本信息,**文件大小、文件類型、數據塊索引

    目錄項

    保存目錄信息 主要內容是 文件名、inode節點號

    五、主函數實現

    主函數主要是為了打開文件系統以及給一定的提示信息。

    提示信息的輸出

    void help(){
        printf("****************************************************\n");
        printf("*歡迎來到xinglei 的文件系統!!!                   \n");
        printf("*主要的功能介紹                                     \n");
        printf("*    0.創建系統  :create_filesystem                 \n");
        printf("*    1.格式化    :init                              \n");
        printf("*    2.低級格式化:low_init                          \n");    
        printf("*    3.查看信息  :info                              \n");   
        printf("*    4.創建文件  :mkfile                            \n");
        printf("*    5.查看位示圖:weishitu                          \n");
        printf("*    6.刪除文件  :delfile                           \n");
        printf("*    8.幫助信息  :help                              \n");
        printf("*    9.顯示文件  :ls                                \n");   
        printf("*    10.退出     :quit                              \n"); 
        printf("****************************************************\n");
    }

    主要就是打印一些提示信息,方便用戶使用這個系統。

    類終端功能實現

    char* command[] = {"create_filesystem","init","low_init","info","mkfile","weishitu","delfile","deldir","help","ls","quit"};
    int commandnum = sizeof(command)/sizeof(char *);
    char path[100] = "file_system";//文件系統
    while(1){
            printf("%s$ ",path);
            scanf("%s",com);
            choice = i;
            for(i=0; i                    if(strcmp(com,command[i])==0)
                            break;
            choice = i;
            if(Disk == -1 && (!(choice == 0|| choice == 10))){//未創建文件只能退出或者創建文件
                printf("文件系統未創建,請創建文件系統。");
                continue;
            }
            int a;
            read(Disk,&a,sizeof(int));
            if(Disk != -1 &&a == 0 && !(choice == 1 || choice == 2)){
                printf("未格式化,請格式化.");
    

    c 讀取文件多行文本_c中刪除文本文件_c中刪掉文件夾中所有文件

    lseek(Disk,-sizeof(int),SEEK_CUR); continue; } lseek(Disk,-sizeof(int),SEEK_CUR); switch(choice){ case 0://創建系統 create_filesystem(); break; case 1://格式化 init(1); break; case 2://低級格式化 low_init(); break; case 3://查看信息 info(); break; case 4://創建文件 printf("輸入你要創建的文件名: "); char filename[20]; scanf("%s",filename); create_file(filename); break; case 5://查看位示圖 weishi(); break; case 6://刪除文件 printf("請輸入你要刪除的文件:"); char delname[20]; scanf("%s",delname); delfile(delname); break; case 8://幫助信息 help(); break; case 9://顯示文件 ls(); break; case 10: //退出系統 quit = 1; break; default: printf("%s command not found\n",com); }

    很顯然,我定義了一個,然后根據輸入命令的比較結果來選擇執行哪個分支,默認就是重新回到開頭。在程序運行的時候我已經做了打開文件的操作,因為我第超級塊的前4個字節的數據是固定的不為0c中刪除文本文件,所以我可以用它來判斷是否已經格式化,然后其它的就是跳轉到相應的功能中就好了0.0

    這只是基礎程序框架,我們其它功能使用另外一個文件來實現

    c中刪除文本文件_c 讀取文件多行文本_c中刪掉文件夾中所有文件

    六、文件功能定義

    上面我們已經實現了基礎的程序功能,這部分我們要深入細節,完成每一個小功能的實現。

    主要數據結構

    ?超級塊

    就是像剛才說的保存基礎信息

    typedef struct{
        int inodes_count,   blocks_count;               //超級塊和indoe總數
        int free_inodes_count,  free_blocks_count;          //未使用block和inode量
        short block_size,   inode_size;             //block和indoe大小 B
        int first_data_block,   first_inode_block;          //第一塊數據塊第一塊inode節點位置
        int inode_wei,      block_wei;              //位示圖所在塊號
        short inodes_per_block;                     //每片中的inode數目
        short frag_size;                        //每片大小
        int root_inode;                         //根節點inode號
        int size;                           //總大小B
    }chao;      //超級塊定義

    ?inode節點

    這應該是最簡陋的inode節點了把?

    typedef struct{
        int i_mode;     //文件類型,1表示文件,0文件表示目錄項
        int i_size;     //文件的大小單位為B
        int i_blocks;       //文件所占塊數 
        int i_block[15];    //索引節點 12個直接索引 1個一級索引 2個二級索引
    }inode;     //inode節點定義

    ?目錄項

    目錄項不用特別復雜

    typedef struct{
        char name[28];
        int inode;
    }mulu;      //目錄項定義

    ?位示圖

    就簡單的一個位就好了。

    unsigned int weishitu[1024];//位示圖定義

    創建文件系統

    這個功能就很簡單,就創建一個128MB的文件就好了。注意判斷是否已經存在文件避免覆蓋。

    我用了一個4K的數組循環32K次寫入來達到.0

    void create_filesystem(){
        if(Disk != -1){
            printf("已經存在文件系統\n");
            return;
        }
        Disk = open(DISK,O_CREAT|O_WRONLY,S_IRWXO|S_IRWXG|S_IRWXU);
        int a[1024] = {0};
        for(int i = 0;i < 1<<15;i++) write(Disk,(void *)a,sizeof(a));//創建128MB文件
    

    c中刪除文本文件_c 讀取文件多行文本_c中刪掉文件夾中所有文件

    printf("創建文件系統成功\n"); }

    格式化

    這部分就億點點復雜需要做的事情有一些多。

    就是重寫超級塊、重寫位示圖、創建根節點信息。

    代碼就不放了 因為太長了-.-

    可以在倉庫中找到,我相信你們看得懂

    低級格式化

    其實我們平時也有用到低級格式化,其實就將所有數據置為0。然后再執行高級格式化就好了。

    void low_init(){
        int temp;
        read(Disk,&temp,sizeof(int));
        if(temp){
            printf("此操作會清空磁盤,且不可恢復,確定?Y/N  ");
            char s[10];
            while(scanf("%s",s) != EOF && !(!strcmp(s,"Y") || !strcmp(s,"N")))
                printf("請輸入正確的字符");
            if(strcmp(s,"N") == 0){
                printf("用戶取消\n");
                return ;
            }
        }
        close(Disk);
        Disk = open(DISK,O_WRONLY);
        int a[1024] = {0};
        for(int i = 0;i < 1<<15;i++) write(Disk,a,sizeof(a));//全部位置置0
        close(Disk);
        Disk = open(DISK,O_RDONLY);
        printf("低級格式化完成\n");
        init(0);
    }

    這里其實和創建文件很類似,但是要注意判斷是否已有系統給與對應提示。

    創建文件

    這里已經簡化了很多了,只做了創建文件,并不寫入數據,所以就是找空間分配空間,寫入就好了。

    但是要實現找inode節點、找數據節點等多個方法,所以請看源碼。。

    刪除文件

    相比較而言刪除文件就簡單很多直接將inode和數據區進行回收就好了。

    好了,由于很多細節放代碼過于復雜今天就寫到這里了。

    七、寫在最后

    這只是這次作業的的一部分,有點難懂,而且做成的也只能在電腦上跑跑看而已,第二部分是一個多線程詞頻統計工具,可以對某個文件目錄所有英文單詞的出現頻率進行統計打印,就有用很多。

    如果點贊破百的話,我交作業前(11.30)肯定能更新出來0.0

    海報我都做好了-.-

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有