之前知道lseek這個系統呼叫可以改變檔案的偏移量,或者叫偏移量或指標。
檔案偏移量是指執行下乙個read或者write操作的檔案起始位置,會以相對於檔案頭部起始點的檔案當前位置來表示。
檔案第乙個位元組的偏移量為0。
檔案開啟時,會將檔案偏移量設定為指向檔案的開始,以後每次read或write呼叫將自動對其進行調整,以指向已讀或已寫資料後的下一位元組。因此連續的read和write呼叫將按順序遞進,對檔案進行操作。
lseek會根據offset和whence引數值來調整檔案的偏移量。
off_t lseek(int fd, off_t offset, int whence)
offset 指定了乙個以位元組為單位的數值
whence 表明應參照哪個基點來解釋offset引數,應為下列其中之一:
seek_set 將檔案偏移量設定為檔案頭部起始點開始的offset位元組
seek_cur 相對於當前檔案偏移量,將檔案偏移量調整offset個位元組
seek_end 將檔案偏移量設定為起始於檔案尾部的offset個位元組,也就是offset應該從檔案最後乙個位元組之後的下乙個位元組算起。
早期的unix實現中,whence引數用整數0,1,2來表示的。
如果whence引數值為seek_cur或者seek_end,那麼offset引數可以為正數也可以為負數;如果whence引數值為seek_set,offset引數值必須為非負數。
lseek呼叫成功會返回新的檔案偏移量,下面呼叫只是獲取檔案偏移量的當前位置,並沒有修改它。
curr = lseek(fd, 0, seek_cur);
lseek(fd, 0, seek_set); start of file
lseek(fd, 0, seek_end); next byte after the end of the file
lseek(fd, –1, seek_end); last byte of file
lseek(fd, –10, seek_cur); ten bytes prior to current location
lseek(fd, 10000, seek_end); 10001 bytes past last byte of file
lseek呼叫只是調整核心中與檔案描述符相關的檔案偏移量記錄,並沒有引起對任何物理裝置的訪問。
檔案偏移量,檔案描述符和已開啟檔案的關係還需要進一步釐清。
lseek並不適用於所有型別的檔案,不允許將lseek應用於管道、fifo、socket或者終端。
一旦如此,呼叫將會失敗,並將errno置為espipe。
另一方面,只要合情合理,也可以將lseek應用於裝置,例如磁碟或者磁帶上的某一具體位置。
lseek的l**於long。
lseek和檔案空洞。
檔案偏移量可以大於檔案的當前長度的,在這種情況下,該檔案的下一次寫將加長該檔案,並在檔案中構成乙個空洞,這一點是允許的。位於檔案中但沒有寫過的位元組都被讀為0。
1 #include 2 #include 3 #include 4 #include 5 #include 6檔案中的空洞並不要求在磁碟上占用儲存區。7#define file_mode (s_irusr | s_iwusr | s_irgrp | s_iroth)
8char buf1 = "
abcdefghij";
9char buf2 = "
abcdefghij";
1011
int main(int argc, char *ar**)
unix系統程式設計
popen pclose popen介面定義 include file popen const char command,const char type int pclose file stream popen函式會建立乙個管道,並且建立乙個子程序來執行shell,shell會建立乙個子程序來執行c...
UNIX系統程式設計1
man 你想查詢的內容 如果man你也不會用也不要緊,那你就 man man 一下,呵呵。只可惜好像還沒有翻譯成中文,對於像我這樣英文水平還有待提高的朋友來說讀起來有點麻煩。最後還有乙個好工具就是網路,有什麼不會的google一下好多問題都能解決。好,囉嗦的半天,說歸正傳,免得給大家造成光說不練的印...
Unix系統程式設計()brk,sbrk
在堆上分配記憶體 程序可以通過增加堆的大小來分配記憶體,所謂堆是一段長度可變的連續虛擬記憶體,始於程序的未初始化資料段末尾,隨著記憶體的分配和釋放而增減。通常將堆的當前記憶體邊界稱為 program break 下面也會學習一族函式brk,sbrk和malloc。調整program break br...