Linux程序設計-學習筆記-第三章文件操作

3.1 Linux 文件結構

 

       Linux中,一切都是文件!一切!比較重要的三個設備文件:/dev/console 代表控制檯  /dev/tty 代表控制終端 /dev/null 代表空,寫向這個設備的數據都將被刪除。

       inode: 文件除了本身包含的內容以外,他還會有一些名字和屬性,即一些“管理信息”,如創建、修改日期和它的訪問權限等,這些屬性被保存在文件的inode中。對於每個 ext2 分區來說,其在物理磁盤上的佈局如圖 所示:

從圖中可以看到,對於 ext2 文件系統來說,磁盤被劃分成一個個大小相同的數據塊,每個塊的大小可以是1024、2048 或 4096 個字節。其中,第一個塊稱爲引導塊,一般保留做引導扇區使用,因此 ext2 文件系統一般都是從第二個塊開始的。剩餘的塊被劃分爲一個個的塊組,ext2 文件系統會試圖儘量將相同文件的數據塊都保存在同一個塊組中,並且儘量保證文件在磁盤上的連續性,從而提高文件讀寫時的性能。

每個塊組都包含以下內容:

  1. 超級塊。存放文件系統超級塊的一個拷貝。
  2. 組描述符。該塊組的組描述符。
  3. 數據塊位圖。標識相應的數據塊是否空閒。
  4. 索引節點位圖。標識相應的索引節點是否空閒。
  5. 索引節點表。存放所有索引節點的數據。
  6. 數據塊。該塊組中用來保存實際數據的數據塊。

3.2 系統調用和設備驅動程序

     系統調用不多說,就是通往os本身的接口。

     os內核就是一組設備驅動程序,是一些對硬件進行控制的底層接口。爲了向用戶提供一個統一的接口,設備驅動程序封裝了所有與硬件相關的特性。單獨一個硬件的特性通過ioctl調用來完成,其他的open read write close 函數都一樣。

 

3.3庫函數

     直接使用系統調用效率非常低,爲了提供更高層的接口,Linux發行了一系列標準函數庫,來幫助提高系統效率。下圖看出庫函數的位置。

3.4底層文件訪問(就是系統調用)

        文件描述符:每個進程都有一些與自身關聯的文件描述符,默認自動打開的文件描述符有:

         0---標準輸入

         1---標準輸出

         2---標準錯誤

         還可以使用open函數把文件描述符和設備關聯起來。文件描述符對每個進程是唯一的。write read open現用現查吧!注意一下open函數帶O_CREAT標記時的權限問題,這又涉及到了umask變量。chmod命令可以突破umask變量的限制。

         書中的例子用到了一個計時工具,$ TIMEFORMAT=“ ” time ./myexe 來計時myexe的運行時間。

         lseek 對讀寫指針進行設置,fstat stat lsate 系統調用返回相關的文件狀態信息,dup dup2函數提供了複製文件描述符的方法,使我們通過兩個或者多個不同的文件描述符來訪問同一個文件,可以實現在不同的位置對文件進行讀寫。

 

3.5標準I/O庫

         在標準io庫中,與底層文件描述符相對等的是流stream,他被實現爲指向結構FILE的指針,有三個文件流是自動打開的,stdin、stdout和stderr分別代表標準輸入、 標準輸出、標準錯誤輸出與底層文件描述符0、1、2相對應。流的理解還應該加深啊!

         與文件描述符一樣,可用的文件流數目也是有限的,這個限制在stdio.h中的FOPEN_MAX常量定義,最小爲8.一些函數如:fopen、fclose、fread、fwrite、fflush、fseek、fgetc、fputc、fgets等等,現用現查吧。

3.6格式化輸出和輸出

 

        printf(到標準輸出)、fprintf(到文件)、sprintf(到字符串)。

      (1)d(或i)格式符。用來輸出十進制整數,有以下幾種用法:

        ①%d,按整型數據的實際長度輸出。
        ②%md,m爲指定的輸出字段的寬度。如果數據的位數小於m,則左端補以空格,若大於m,則按實際位數輸出。
        ③%ld(%mld 也可),輸出長整型數據。
         例如:long a=123456; printf("%ld",a);
    (2)o格式符,以八進制數形式輸出整數。格式:%o,%mo,%lo,%mlo都可。
      (3)x(或X)格式符,以十六進制數形式輸出整數。格式:%x,%mx,%lx,%mlx都可。
      (4)u格式符,用來輸出unsigned型數據,即無符號數,以十進制數形式輸出。格式:%u,%mu,%lu都可。
       參見:li4-3.c/*無符號數據的輸出*/
      (5)c格式符,用來輸出一個字符。格式:%c,%mc都可。
      (6)s格式符,用來輸出一個字符串。格式:%s,%ms,%-ms,%m.ns,%-m.ns都可。
      (7)f格式符,用來輸出實數(包括單、雙精度),以小數形式輸出。格式:%f,%m.nf,%-m.nf都可。
       注意:單精度實數的有效位數一般爲7位,雙精度爲16位。
      (8)e(或E)格式符,以指數形式輸出實數。格式:%e,%m.ne,%-m.ne都可。
      (9)g(或G)格式符,輸出一個雙精度浮點數。

     
      scanf、fscanf、sscanf 關鍵是這句 scanf(“hello  %d”,&num);中的空格代表“無、空格、tab、回車,多個空格、多個回車多個tab”等。
       有一個外部變量 errno ,在函數調用失敗時,會被賦予有意義的值,但需要立即檢查。ferror、feof、cleareer等相關函數。strerror函數把錯誤編碼映射爲一個字符串,該字符串對發生的錯誤類型進行了說明。
       每個流和一個底層文件描述符相關聯,fileno函數通過流火的文件描述符,fdopen函數通過文件描述符川建一個流。
3.7、3.8文件和目錄維護
       與目錄操作有關的函數在dtrent.h頭文件中聲明。一個名爲DIR的結構作爲五路操作的基礎,被稱爲目錄流,使用方法與FILE*非常相似。目錄數據項本身在dirent結構中返回。相關函數:opendir、readdir、telldir
seekdir、closedir
3.10/proc文件系統
       /proc/cpuinfo給出的是cpu的詳細信息;/proc/meminfo內存使用信息;/proc/version內存版本信息。每一個數字目錄代表一個進程。簡單介紹一下,呵呵
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章