3.1 linux 檔案結構
linux中,一切都是檔案!一切!比較重要的三個裝置檔案:/dev/console 代表控制台 /dev/tty 代表控制終端 /dev/null 代表空,寫向這個裝置的資料都將被刪除。
inode:檔案除了本身包含的內容以外,他還會有一些名字和屬性,即一些「管理資訊」,如建立、修改日期和它的訪問許可權等,這些屬性被儲存在檔案的inode中。對於每個 ext2 分割槽來說,其在物理磁碟上的布局如圖 所示:
從圖中可以看到,對於 ext2 檔案系統來說,磁碟被劃分成乙個個大小相同的資料塊,每個塊的大小可以是1024、2048 或 4096 個位元組。其中,第乙個塊稱為引導塊,一般保留做引導扇區使用,因此 ext2 檔案系統一般都是從第二個塊開始的。剩餘的塊被劃分為乙個個的塊組,ext2 檔案系統會試圖盡量將相同檔案的資料塊都儲存在同乙個塊組中,並且盡量保證檔案在磁碟上的連續性,從而提高檔案讀寫時的效能。
每個塊組都包含以下內容:
超級塊。存放檔案系統超級塊的乙個拷貝。
組描述符。該塊組的組描述符。
資料塊點陣圖。標識相應的資料塊是否空閒。
索引節點位圖。標識相應的索引節點是否空閒。
索引節點表。存放所有索引節點的資料。
資料塊。該塊組中用來儲存實際資料的資料塊。
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記憶體版本資訊。每乙個數字目錄代表乙個程序。簡單介紹一下,呵呵
第三章學習筆記
執行執行緒,簡稱執行緒,是在程序中活動的物件。核心排程的物件是執行緒,而不是程序。程序描述符中包含的資料能完整地描述乙個正在執行的程式 各種狀態之間存在轉換的條件,若滿足則進行轉換,跟模擬電路中所學的狀態機是乙個道理。通過st task state task,state 函式來設定當前程序狀態 fo...
第三章筆記
第三章預習筆記 一 高階語言和機器指令中的運算 1,按位運算 符號 按位or運算 符號 按位and運算 符號 表示按位not運算 符號 按位xor運算。實現掩碼操作 通過與給定的乙個位模式進行按位與,可以提取所需要的位,對這些位進行 置1 清0 等。2,符號 按位or運算 符號 表示and運算 符號...
Linux系統程式設計(第三章)筆記
由於塊是檔案系統中最小儲存單元的抽象,在核心中,所有檔案系統操作都是基於塊來執行。因此所有i o操作都是在塊大小或者塊大小的整數倍上執行。假設要讀取1024個位元組,每次讀乙個位元組需要1024次呼叫,而如果乙個讀取1024位元組的塊則只需要呼叫一次。對於這種提公升其效能的途徑是 使用者緩衝i o ...