Unix系統程式設計()lseek系統呼叫

2021-09-08 05:13:04 字數 1884 閱讀 2502

之前知道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...