lseek

Header Files

#include <sys/types>
#include <unistd.h>

Function Prototype

off_t lseek(int filedes, off_t offset, int whence)

Function

可以讓你位移 Open file table 中的 current file offset 的位置,也就是更改你目前讀到哪裡

只有 offset 位移,沒有 I/O 操作

Parameters

filedes

要更改哪個 file descriptor 對應的 open file 物件

offset

要位移多少個 bytes

whence

指定偏移量是從哪裡開始算的

  1. SEEK_SET: 相對於檔案開頭
  2. SEEK_CUR: 相對於當前位置
  3. SEEK_END: 相對於檔案結尾

Weird Things with lseek

1. 負偏移量 (Negative Offset)

用途:往回移動檔案指標
例如:lseek(fd, -10, SEEK_CUR) 從當前位置往前退 10 個位元組,或 lseek(fd, -100, SEEK_END) 移動到檔案結尾前 100 個位元組的位置。常用於重新讀取資料或從檔案尾端往前搜尋

2. 移動 0 位元組 (Seek 0 bytes)

用途:查詢當前檔案位置,不改變位置
lseek(fd, 0, SEEK_CUR) 的返回值就是當前檔案指標位置。這是獲取目前讀寫位置的標準方法,就像問系統”我現在在第幾個位元組?“

3. 超越檔案結尾 (Seek past EOF)

用途:創建稀疏檔案(有”洞”的檔案)
lseek(fd, 1000, SEEK_END) 移動到檔案結尾後 1000 位元組,然後寫入資料。中間的 1000 位元組成為”洞”—邏輯上存在但不佔實際磁碟空間,讀取時返回零值。用於創建大型檔案但節省空間