Linux的編譯檔案操作

2021-10-24 09:09:51 字數 1954 閱讀 1372

**:

檔案程式設計的內容很多,但是重點在應用,主要關心如何用**操作檔案,實現檔案建立,開啟,編輯等自動化執行。

開啟 open

讀寫 write/read;

游標定位 lseek;

關閉 close

int close(int fd)

引數說明:

fd:是需要關閉的檔案描述符

標頭檔案:#include

原型:ssize_t write(int fd,const void*buf,size_t count);

引數說明:

fd:是檔案描述符(write所對應的是寫,即就是1)

buf:通常是乙個字串,需要寫入的字串

count:是每次寫入的位元組數(也就是buf的大小)

返回值:

成功:返回寫入的位元組數

失敗:返回-1並設定errno

ps: 寫常規檔案時,write的返回值通常等於請求寫的位元組數count, 而向終端裝置或者網路寫時則不一定

標頭檔案:#include

功能:用於從檔案描述符對應的檔案讀取資料(從開啟的裝置或檔案中讀取資料)

原型:ssize_t read(int fd,void *buf,size_t count)

引數說明:

fd: 是檔案描述符

buf: 為讀出資料的緩衝區;

count: 為每次讀取的位元組數(是請求讀取的位元組數,讀上來的資料儲存在緩衝區buf中,同時檔案的當前讀寫位置向後移)

返回值:

成功:返回讀出的位元組數

失敗:返回-1,並設定errno,如果在呼叫read之前到達檔案末尾,則這次read返回0

1、對於核心而言,所有開啟檔案都是由檔案描述符引用的。檔案描述符是乙個非負整數。當開啟乙個現存盤案或者建立新檔案時,核心向程序返回乙個檔案描述符。當讀乙個檔案時,用open或create返回的檔案描述符標識該檔案,將其作為引數傳遞給read和write。按照慣例,unix shell使用檔案描述符0與程序的標準輸入相結合,檔案描述符1與標準輸出相結合,檔案描述符1與標準輸出相結合,檔案描述符2與標準錯誤輸出相結合,再開啟乙個新的檔案的話,它的檔案描述符就是3。stdin_filno,stout_fileno、stderr_fileno這幾個巨集代替了0、1、2這幾個數字。

2、檔案描述符,這個數字在乙個程序中表示乙個特定含義,當我們open乙個檔案時,作業系統在記憶體中構建了一些資料結構來表示這個動態檔案,然後返回給應用程式乙個數字作為檔案描述符,這個數字就和我們記憶體中維護的這個動態檔案的這些資料結構定上了,以後我們應用程式如果要操作這個動態檔案,只需要用這個檔案描述符區分。

3、檔案描述符的作用域就是當前程序,出了這個程序檔案描述符就無意義了。

4、在linux中要操作乙個檔案,一般是先開啟乙個檔案,得到檔案描述符,然後對檔案進行讀寫操作(或其他操作),最後是close關閉檔案。

5、強調一點:我們對檔案進行操作時,一定要先開啟檔案,開啟成功之後才能操作,如果失敗,就不用進行後邊的操作了,最後讀寫完成後,一定要關閉檔案,否則會造成檔案損壞。

6、檔案平時時存放在塊裝置中的,我們把這種檔案叫靜態檔案,當我們去open開啟乙個檔案時,linux核心做的操作包括:核心在程序中建立乙個開啟檔案的資料結構,記錄下我們開啟的這個檔案;核心在記憶體中申請一段記憶體,並且將靜態檔案的內容從裝置中讀取到核心中特定位址管理存放(叫動態檔案)。

7、開啟檔案以後,以後對這個檔案的讀寫操作,都是針對記憶體中的乙份動態檔案,並不是針對靜態檔案。當然我們對動態檔案進行讀寫以後,此時記憶體中的動態檔案和塊狀裝置中的靜態檔案就不同步了,當我們close關閉動態檔案時,close內部核心將記憶體中的動態檔案的內容去更新(同步)塊裝置中的靜態檔案。

8、為什麼這麼設計,不直接對塊裝置直接操作。

塊裝置本身讀寫非常不靈活,是按塊讀寫的,而記憶體是按位元組單位操作的,而且可以隨機操作,很靈活。

KEIL編譯檔案

keil rvmdk編譯後的資訊 program size code 86496 ro data 9064 rw data 1452 zi data 16116 code是 占用的空間 ro data是 read only 唯讀常量的大小,如const型 rw data是 read write 初始...

Linux 編譯檔案時的 swp問題於vim命令

今天在虛擬機器上編譯文字文件時,編譯完成異常退出文字,而產生了.1.txt.swp,再次編譯或建立新文字時,會產生新的.swp檔案,而導致文字不能夠正常編譯。如 這種情況是因為存在異常退出而導致的,如果要編譯新產生的文字文件,此時我們要先把這個.swp檔案刪除,在使用vim 進行文字的編譯 刪除後,...

關於linux編譯檔案的一些感想

近段時間,博主一直在學習gcc編譯以及make的一些知識,有一些小的感想分享一下。我們在編譯檔案的時候一直採用的是 假設我們有 1.h 1.cpp 2.h 2.cpp main.cpp 我們編譯經常是 g c 1.cpp g c 2.cpp g c main.cpp g o 1.o 2.o main...