Linux應用編程之lseek詳解


Linux應用編程之lseek詳解

1、lseek函數介紹

(1)、文件指針:當我們要對一個文件進行讀寫時,一定要先打開這個文件,所以我們讀寫的所有文件都是動態文件。動態文件在內存中的形態就是文件流的形式。

(2)、文件流很長,里邊有很多個字節。那我們當前正在操作的是哪一個位置呢?GUI模式下的軟件用光標來標識這個當前正在操作的位置,這個是給人看的。

(3)、在動態文件中,我們會通過文件指針來表征這個正在操作的位置。所謂文件指針,就是我們文件管理表這個結構體里邊的一個指針。所以文件指針其實是vnode中的一個元素。這個指針表示我們當前正在操作文件流的哪個位置。這個指針不能被直接訪問,Linux系統用lseek函數來訪問這個文件指針。

(4)、當我們打開一個空文件時,默認情況下文件指針指向文件流的開始。所以這時候去寫write時寫入的就是從文件開頭開始的。write和read函數本身自帶移動文件指針的功能,所以我們write了n個字節后,文件指針會自動向后移動n位。如果需要人為的隨意更改文件指針,那就只能通過lseek函數了。

(5)、read和write函數都是從當前文件指針出開始操作的,所以當我們用lseek函數將文件指針移動后,那么再去read/write時就是從移動過后的位置開始的了。

2、用lseek計算文件長度

(1)Linux中並沒有一個函數可以直接返回一個文件的長度。但是我們做項目時經常會需要知道一個文件的長度,怎么辦?自己利用lseek來寫一個函數得到文件長度。

我們用lseek將文件指針移動到末尾,然后返回值就是文件指針距離文件開頭的偏移量,也就是文件的長度了。 

ret = lseek(fd, 0, SEEK_END);

3、用lseek構建空洞文件

(1)、空洞文件就是文件中有一段是空的。

(2)、普通文件中間是不能有空的,因為我們write時文件指針是依次從前向后去移動的,不可能繞過前面直接到后面。

(3)、我們打開一個文件后,用lseek往后跳過一段,再write寫入一段,就會構成一個空洞文件。

(4)、空洞文件方法對多線程共同操作文件是及其有用的。有時候我們創建一個很大的文件,如果從頭開始依次構建的話,時間會很長。有一種思路就是將文件分為多段,然后多線程來操作每個線程負責其中一段的寫入。

4、補充文件,今天學習的時候,發現有個代碼沒看明白,后來上網查,才弄明白

int main(int argc, char *argv)

int argc, char **argv 用於運行時,把命令行的參數傳入主程序。

argc -- 命令行參數的 總個數,包括 可執行程序名。
argv[i] -- 第 i 個參數。
argv[0] -- 可執行程序名。

例如運行:
./a.out
argc 等於 1, argv[0] 是 "a.out"=


例如運行:
./a.out  b  5.2
argc 等於 3, argv[0] 是 "a.out", argv[1] 是 "b", argv[2] 是 "5.2".


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM