lseek函式:
#include可以呼叫lseek顯示地為乙個開啟檔案設定偏移量。off_t lseek(int fd, off_t offset, int whence);
返回值:若成功,返回新的檔案偏移量;若失敗,返回-1
檔案偏移都是核心概念,所以lseek並不會引起任何真正的 i/o 操作。對引數offset的解釋與引數whence的值有關:
若lseek成功執行,則返回新的檔案偏移量,為此可以用下列方式正確打錢檔案的當前偏移量:
off_t currpos;
currpos = lseek(fd, 0, seekcur);
這種方法,也可以用來確定所涉及的檔案是否可以設定偏移量。如果檔案描述符指向的是乙個管道,fifo或者網路套接字,則lseek返回-1,並將errno設定為espipe。
不是每個檔案都能夠設定偏移量,有些裝置(或者說裝置檔案)不能使用lseek,linux系統不允許lseek()對tty裝置進行操作,此項操作會使得lseek()範圍錯誤**espipe,也有些檔案如管道,fifo或socket,無法設定偏移量,可以使用如下函式測試是否可以設定偏移量,如果返回-1,則表示不可以。
3個符號量seek_set,seek_cur和seek_end是在system v中引入的,在system v之前,whence被指定為0(絕對偏移量),1(相對偏移量),或者2(相對檔案尾端的偏移量)。很多軟體仍然把這些數字直接寫在**裡。例項:下面的程式用於測試對其標準輸入能否設定偏移量。在lseek中的字元1表示長整型,在引入off_t資料型別之前,offset引數和返回值是長整型的。lseek是在unix v7中引入的,當時c語言中增加了長整型(在unix v6中,用函式seek和tell提供類似功能)。
#include "apue.h"
int main(void)
else
exit(0);
}
如果用互動方式呼叫此程式,則可得:
$ ./a.out < /etc/passwd
seek ok
$ cat > /etc/passwd | ./a.out
cannot seek
$ ./a.out < /var/spool/cron/fifo
cantnot seek
通常,檔案的當前偏移量應當是乙個非負整數,但是,某些裝置也可能會允許負的偏移量,但是對於普通檔案,其偏移量必須是非負值。因為偏移量可能是負值,所以在比較lseek的返回值時,應當謹慎,不要測試它是否小於0,而是要測試它是否等於-1。
在intel x86處理騎上執行的freebsd的裝置,/dev/kmem支援負的偏移量。linux 中的大部分系統呼叫來說,如果返回值是負數,那麼它一般都是錯誤的,但是對於lseek來說,這條規則並不適用,lseek的返回值說明:因為偏移量(off_t)是帶符號資料型別,所以檔案的最大長度會減少一半,例如,如果off_t是32位整型,則檔案最大長度是2的31次方 - 1位元組。
當lseek執行成功是,他會返回最終以檔案其實位置為起點的偏移量。如果出錯,則返回 -1 ,同時errno被設定為對應的錯誤值也就是說,一般情況下,對於普通檔案,lseek的返回值都是非負的整數,但是對於某些裝置檔案來說,是允許返回負的偏移量。因此想要判斷lseek是否真的出錯,必須在呼叫lseek前,將errno重置為0,然後在呼叫lseek,同時檢查返回值是否為 -1 及errno的值。只有當兩個同時成立時,才標明lseek真的出錯了。
lseek函式的用法lseek函式的用法
使用 lseek 函式可以改變檔案的 cfo include unistd.h include off t lseek int filedes,off t offset,int whence 返回值 新的偏移量 成功 1 失敗 引數 offset 的含義取決於引數 whence 1.如果 whenc...
linux下 lseek函式用法
lseek函式 用法 表頭檔案 include include 定義函式 off t lseek int fildes,off t offset,int whence seek set 引數offset即為新的讀寫位置 seek cur 當前讀寫位置後增加offset個位移量。seek end 將讀...
Linux系統庫函式 lseek函式用法
使用 lseek 函式可以改變檔案的 cfo include off t lseek int filedes,off t offset,int whence 返回值 新的偏移量 成功 1 失敗 引數 offset 的含義取決於引數 whence 1.如果 whence 是 seek set,檔案偏移...