Linux lseek函數(shù)的使用詳解
注:如果文章內(nèi)容有誤,請留言指出,謝謝合作。
名字
Name : lseek - reposition read/write file offset
lseek函數(shù)的作用是用來重新定位文件讀寫的位移。
頭文件以及函數(shù)聲明
#include <sys/types.h> #include <unistd.h> off_t lseek(int fd, off_t offset, int whence);
offset為正則向文件末尾移動(向前移),為負(fù)數(shù)則向文件頭部(向后移)。
描述
lseek() repositions the file offset of the open file description associated with the file descriptor fd to the argument offset according to the directive whence as follows:
SEEK_SET The file offset is set to offset bytes.
SEEK_CUR The file offset is set to its current location plus offset bytes.
SEEK_END The file offset is set to the size of the file plus offset bytes.
lseek() allows the file offset to be set beyond the end of the file (but this does not change the size of the file). If data is later written at this point, subsequent reads of the data in the gap (a “hole”) return null bytes (‘\0') until data is actually written into the gap.
lseek()函數(shù)會重新定位被打開文件的位移量,根據(jù)參數(shù)offset以及whence的組合來決定:
SEEK_SET:
從文件頭部開始偏移offset個字節(jié)。
SEEK_CUR:
從文件當(dāng)前讀寫的指針位置開始,增加offset個字節(jié)的偏移量。
SEEK_END:
文件偏移量設(shè)置為文件的大小加上偏移量字節(jié)。
測試代碼:
#include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <stdio.h> #define BUFFER_SIZE 1024 #define SRC_FILE_NAME "src_file" #define DEST_FILE_NAME "dest_file" //根據(jù)傳入的參數(shù)來設(shè)置offset #define OFFSET (atoi(args[1])) int main(int argc, char*args[]) { int src_file, dest_file; unsigned char buff[BUFFER_SIZE]; int real_read_len, off_set; if (argc != 2) { fprintf(stderr, "Usage: %s offset\n", args[0]); exit(-1); } src_file = open(SRC_FILE_NAME, O_RDONLY); dest_file = open(DEST_FILE_NAME, O_WRONLY | O_CREAT, S_IREAD | S_IWRITE );//owner權(quán)限:rw if (src_file < 0 || dest_file < 0) { fprintf(stderr, "Open file error!\n"); exit(1); } off_set = lseek(src_file, -OFFSET, SEEK_END);//注意,這里對offset取了相反數(shù) printf("lseek() reposisiton the file offset of src_file: %d\n", off_set); while((real_read_len = read(src_file, buff, sizeof(buff))) > 0) { write(dest_file, buff, real_read_len); } close(dest_file); close(src_file); return 0; }
結(jié)果解析
觀察offset以及dest_file和src_file文件的大小不難看出:程序通過lseek函數(shù)將src_file文件指針重新定位到文件末尾 + offset(注意,本程序?qū)ffset取了相反數(shù),即文件末尾 + (-offset))處,然后從文件末尾 + offset處開始向前復(fù)制文件到dest_file中。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
查看linux ssh服務(wù)信息及運(yùn)行狀態(tài)方法
今天小編就為大家分享一篇查看linux ssh服務(wù)信息及運(yùn)行狀態(tài)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07linux操作系統(tǒng)下配置ssh/sftp和權(quán)限設(shè)置方法
這篇文章主要介紹了linux操作系統(tǒng)下配置ssh/sftp和權(quán)限設(shè)置方法 ,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-11-11基于cobbler 實(shí)現(xiàn)自動安裝linux系統(tǒng)
這篇文章主要介紹了cobbler 自動安裝linux系統(tǒng)的教程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-11-11centos7.2.1511安裝jdk1.8.0_151及mysql5.6.38的方法
這篇文章主要介紹了centos7.2.1511安裝jdk1.8.0_151及mysql5.6.38的方法,較為詳細(xì)的講述了centos7.2.1511安裝jdk1.8.0_151及mysql5.6.38的具體步驟與相關(guān)設(shè)置技巧,需要的朋友可以參考下2018-01-01Linux關(guān)于Sudo的隱晦bug引發(fā)的一次業(yè)務(wù)問題排查
這篇文章主要介紹了Linux關(guān)于Sudo的隱晦bug引發(fā)的一次業(yè)務(wù)問題排查,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04Linux下使用SSH遠(yuǎn)程執(zhí)行命令方法收集
這篇文章主要介紹了Linux下使用SSH遠(yuǎn)程執(zhí)行命令方法收集,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-10-10