關於檔案IO(APUE)

2021-10-04 20:12:51 字數 3232 閱讀 6622

之前讀完了整本apue,也是那種朦朦朧朧的讀完的,好多知識點看一遍就過了,對著敲下例程,最近一直研究uboot、kernel底層。回過頭發現好多都忘了,哎。好多函式原型都忘了,花時間重新再讀一次,讀的過程中發現經常會自己問自己些問題,不想上一次完全念書那樣了。書讀百遍其義自見。
api,c庫函式,系統呼叫三者的區別和聯絡

檔案io主要的函式:open,creat,close,write,read,lseek的使用,(從作用,引數,返回值三個方面說起)

檔案描述符0、1、2分別是什麼檔案,定義的符號常量巨集是什麼(定義這些巨集的標頭檔案)。

open函式詳細寫法。

open函式的返回值檔案描述符有什麼特點。如何保證在乙個給定的檔案描述符開啟乙個檔案。

open函式第二個引數oflag的選擇,每個巨集的相應含義(定義這些巨集的標頭檔案)。

檔名(路徑名)最大長度小於我們要建立的(路徑)檔案長度的處理方法。

creat函式詳細用法,等效於什麼函式。creat函式的缺點

close函式詳細用法,程序終止時核心會自動關閉它開啟的所有檔案(所以可以不顯式呼叫close,盡量還是呼叫)

lseek函式詳細用法,第三個引數whence的巨集對應的含義。

lseek引數中檔案描述符關聯的是管道、fifo、網路套接字的情況,當檢視當前偏移量時會返回-1.

lseek的返回值一定是非負整數麼,判斷lseek函式是否呼叫失敗的方法。

什麼是空洞檔案,如何建立空洞檔案。(在命令列檢視檔案內容的方法)

read函式詳細用法,write函式詳細用法,常見的出錯原因

實際讀到的位元組少於要求讀到位元組長度的情況。

動態檔案和靜態檔案分別是什麼,存在於**

核心中是用什麼來表示開啟的檔案(動態檔案),簡述裡面的內容。

什麼是原子操作,需要多個函式呼叫的情況會是原子操作麼

pread函式和pwrite函式詳解用法。

dup函式和dup2函式的用法,兩者的區別,兩者與fcntl函式的區別聯絡

什麼是延遲寫

sync函式、fsync函式和fdatasync函式的詳細用法和區別(資料庫系統)

fcntl函式的詳細用法功能,簡述它的各種功能用法

fcntl有什麼重要意義

ioctl函式詳細用法

/dev/fd是乙個目錄,目錄裡面是0、1、2、、、n等檔案。開啟目錄項下檔案/dev/fd/n的作用是什麼

為什麼有/dev/fd這個目錄

這個應該是必須掌握的基礎知識了,結果回頭看也好多都忘了,上面的e題也是邊看邊想到的,合上書也只能答出80左右吧,都是基礎的知識點了。

這個不能直接複製啊,之後再整理吧,多回頭看看

api、c庫函式、系統呼叫

api:作業系統提供的讓應用程式與開發人員基於某軟體或硬體得以訪問一組例程的能力(不用讀原始碼或者理解),不同作業系統不能通用

c庫函式:程式語言(c語言)本身支援的一些基本函式(不是作業系統提供的),不同作業系統c庫函式通用

系統呼叫:操作提供的可以進入核心態的介面,規定了使用者程序進入核心的具體位置。系統呼叫是使用者空間訪問核心空間的唯一途徑。(裡面的核心是核心函式)

api和系統呼叫之間的區別:api是函式的定義,規定了這個函式的功能,跟核心無直接關係。而系統呼叫是通過中斷向核心發請求,實現核心提供的某些服務。

呼叫的某些api函式(涉及到進入核心態),裡面會封裝到系統呼叫,例如read。某些則不會,例如abs()。系統呼叫是在核心態完成的,api是在庫函式完成的

如下linux中的標準輸入,標準輸出,標準錯誤

中定義了幻數0、1、2來代替stdin_fileno,stdout_fileno,stderr_fileno

open函式:

檔案描述符是個非負整數,而且總是取當前未未開啟的最小的檔案描述符。

例如預設開啟了012三個,新開啟檔案的檔案描述符自動為4(未被占用的最小的),可以利用dup2函式來選擇指定的。

在標頭檔案中

下面這些是可以選擇的,多個選項之間用|。

還有三個是可以選擇的

可以選擇截短或者出錯,通過常量_posix_no_trunc來決定

沒有定義常量_posix_no_trunc,則自動截短,程式不出錯。

定義常量_posix_no_trunc,整個路徑名(某一檔名)超過path_max/name_max時,返回出錯狀態,errorno為enametoolong.

creat

建立的檔案只能寫不能讀,所以需要creat建立的檔案想讀的話需要關閉重新開啟。

close

lseek

當檢視當前偏移量時會返回-1.(管道、fifo、網路套接字)

對於普通檔案肯定是非負整數,但某些裝置允許負的偏移量,所以判斷是不要<0,而是==-1

檔案偏移量大於檔案長度,下次寫加長此檔案,加長的部分就是空洞,被讀為0.

有空洞的檔案既是空洞檔案(未寫過的位元組均為0),空洞檔案利用lseek+write構建,在命令列用od –c 檢視。

read、write

下面幾種情況:(實際靜態檔案磁碟、動態檔案記憶體中(類似uboot環境變數那樣操作)

三種資料結構:程序表項->檔案表項->v節點表項

v節點和i節點相應內容:待補充

原子操作(atomic operation)多步組成的操作,要麼不執行,要麼執行就執行完。

原子操作不可能只執行其中某一步,執行也不會被打斷。多個函式呼叫不會是原子操作,因為兩個系統呼叫之間,核心會臨時掛起該程序。

pread/pwrite

dup、dup2

fcntl函式也可以複製檔案描述符

延遲寫:緩衝區——>輸出佇列——>磁碟(滿足條件:緩衝區滿了、到達隊首)

核心中有高速緩衝區,磁碟i/o,往檔案裡寫內容時,不會直接把資料放入磁碟,而是先存放在乙個緩衝區,緩衝區滿了或者需要用到該緩衝區存別的磁碟快資料。將該緩衝排入輸出佇列。到達隊首後進行實際的i/o操作寫入磁碟。

sync、fsync和fdatasync

sync:把所有修改過的塊緩衝區排入寫佇列,然後返回。(注意還沒有到磁碟呢)

fsync:對指定的fd單一檔案起作用,並且等待到寫入磁碟才返回。(資料+檔案屬性)

fdatasync:類似fsync,只影響資料部分,檔案屬性不關注

fcntl函式

只知道開啟的檔案描述符時,就可以更改檔案性質!,不用知道檔案名字。

例如o_sync同步寫,要知道檔案名字才能實現。利用fcntl也可以實現

複製檔案描述符n。(假定n是開啟的檔案)

主要為shell使用,能夠使用路徑名作為呼叫引數的程式。

關於標準IO(APUE)

這裡的知識和檔案io挺想通的,複習完檔案io,對這裡理解清楚了很多,之前看的雲裡霧裡的。感覺這裡整理清楚檔案 檔案描述符 流 檔案指標 file物件 就容易很多了。還有就是各個函式的詳解 作用 返回值 引數 出錯判斷相關 接著把問題整理在下面吧,然後抽空考自己一下,哈哈哈哈哈有人看到覺得有更深的問題...

關於python檔案 關於python檔案操作

總是記不住api。昨晚寫的時候用到了這些,但是沒記住,於是就索性整理一下吧 python中對檔案 資料夾 檔案操作函式 的操作需要涉及到os模組和shutil模組。得到當前工作目錄,即當前python指令碼工作的目錄路徑 os.getcwd 返回指定目錄下的所有檔案和目錄名 os.listdir 函...

關於inc檔案

what s inc file inc 檔案顧名思義是include file的意思。實際上,檔案的字尾對於檔案包含是無所謂 你可以包含乙個asp檔案,也可以包含txt文。一般我們使用inc作為字尾,是因為這樣能體 現該檔案的作用。why inc file inc檔案的作用有點類似於c c 內的.h...