在該章節(jié)中討論的文件描述符的概念憋他。其中包括:打開(kāi)文件策菜,關(guān)閉文件劣光,從文件中讀取數(shù)據(jù)和向文件中寫(xiě)數(shù)據(jù)亭引。
- 概述
所有執(zhí)行I/O操作的系統(tǒng)調(diào)用都以文件描述符(一個(gè)非負(fù)整數(shù)(通常是比較小的整數(shù)))來(lái)指代打開(kāi)的文件。文件描述符用以表示所有類(lèi)型的已打開(kāi)文件八毯,包括管道(pipe)饱狂、FIFO、socket宪彩、終端休讳、設(shè)備和普通文件。
下面介紹執(zhí)行I/O操作的4個(gè)主要系統(tǒng)調(diào)用: - open:fd=open(pathname,flags,mode)函數(shù)打開(kāi)pathname所標(biāo)識(shí)的文件尿孔,并返回文件描述符俊柔,用以在后續(xù)函數(shù)調(diào)用中指代打開(kāi)的文件。如果文件不存在活合,open()函數(shù)可以創(chuàng)建之雏婶,這取決于對(duì)位掩碼參數(shù)flags的設(shè)置。flags參數(shù)還可以指定文件的打開(kāi)方式:只讀白指、只寫(xiě)亦或讀寫(xiě)方式留晚。mode參數(shù)則指定了由open()調(diào)用創(chuàng)建文件的訪問(wèn)權(quán)限,如果open()函數(shù)沒(méi)有創(chuàng)建文件告嘲,則可以忽略或省略mode參數(shù)错维。
- read :numread=read(fd,buffer,count)調(diào)用從fd所指代的打開(kāi)文件中讀取至多count字節(jié)的數(shù)據(jù),并存儲(chǔ)到buffer中橄唬。read()調(diào)用的返回值為實(shí)際讀取到的字節(jié)數(shù)赋焕。如果再無(wú)字節(jié)刻度,則返回值為仰楚。
- write:numwritten=write(fd,buffer,count)調(diào)用從buffer中讀取多達(dá)count字節(jié)的數(shù)據(jù)寫(xiě)入由fd所指代的已打開(kāi)文件中隆判。write()調(diào)用的返回值為實(shí)際寫(xiě)入文件中的字節(jié)數(shù)犬庇,且有可能小于count。
- close:status=close(fd)在所有輸入/輸出操作完成后侨嘀,調(diào)用close()臭挽,釋放文件描述符fd與之相關(guān)的內(nèi)核資源。
實(shí)現(xiàn)一個(gè)簡(jiǎn)版的cp(1)命令:
#include<sys/stat.h>
#include<fcntl.h>
#include "tlpi_hdr.h"
#include "error_functions.h"http://用來(lái)輸入錯(cuò)誤信息
#ifndef BUF_SIZE
#define BUF_SIZE 1024
#endif
int main(int argc, char const *argv[])
{
int inputFd,outputFd,openFlags;//用來(lái)存儲(chǔ)I/O調(diào)用的返回值
mode_t filePerms; //整型咬腕,用來(lái)表示文件權(quán)限及類(lèi)型
ssize_t numRead; //有符號(hào)整型欢峰,當(dāng)字節(jié)數(shù)(為負(fù)時(shí))表示錯(cuò)誤
char buf[BUF_SIZE];
//strcmp():比較兩個(gè)字符串設(shè)這兩個(gè)字符串為str1,str2郎汪,若str1==str2,則返回零
if(argc!=3||strcmp(argv[1],"--help")==0)
usageErr("%s old-file new-file\n",argv[0]);
inputFd=open(argv[1],O_RDONLY);
if(inputFd==-1)
errExit("opening file %s",argv[1]);
openFlags=O_CREAT | O_WRONLY | O_TRUNC; //open()函數(shù)的參數(shù)闯狱,后面會(huì)介紹
filePerms=S_IRUSR | S_IWUSR |S_IWGRP | S_IROTH |S_IWOTH;
//文件類(lèi)型參數(shù)煞赢,后面介紹
outputFd=open(argv[2],openFlags,filePerms);
if(outputFd==-1)
errExit("opening file %s",argv[2]);
while((numRead=read(inputFd,buf,BUF_SIZE))>0)
if(write(outputFd,buf,numRead)!=numRead)
fatal("couldn't write whole buffer");
if(numRead==-1)
errExit("read");
if(close(inputFd)==-1)
errExit("close input");
if(close(outputFd)==-1)
errExit("close output");
exit(EXIT_SUCCESS);
return 0;
}
- 通用I/O
Unix I/O模型的顯著特點(diǎn)之一就是輸入/輸出的通用性概念。
就是說(shuō)open哄孤、read照筑、write、close可以對(duì)所有類(lèi)型的文件執(zhí)行I/O操作瘦陈,包括終端設(shè)備凝危。所以如果只使用了這些系統(tǒng)調(diào)用編寫(xiě)的程序,可以對(duì)系統(tǒng)內(nèi)所有類(lèi)型的文件使用晨逝。
實(shí)現(xiàn)通用I/O的前提就是確保每一個(gè)文件系統(tǒng)和設(shè)備驅(qū)動(dòng)程序都實(shí)現(xiàn)了相同的I/O系統(tǒng)調(diào)用集蛾默。因?yàn)閘inux下文件系統(tǒng)和設(shè)備所特有的操作細(xì)節(jié)已經(jīng)放在內(nèi)核中處理,所以在編程時(shí)通匙矫玻可以忽略設(shè)備轉(zhuǎn)悠的因素支鸡。而如果應(yīng)用程序需要訪問(wèn)文件系統(tǒng)和設(shè)備的專有功能時(shí),可以選擇ioctl()系統(tǒng)調(diào)用來(lái)處理趁窃,該系統(tǒng)調(diào)用為I/O模型之外的專有特性提供了訪問(wèn)接口牧挣。 - 打開(kāi)一個(gè)文件:Open()
open()調(diào)用既可以打開(kāi)一個(gè)已經(jīng)存在的文件,也能創(chuàng)建并打開(kāi)一個(gè)新文件醒陆。
#include<sys/stat.h>
#include<fcntl.h>
int open(const char* pathname,int flags,.../*mode_t mode*/);
//返回:打開(kāi)成功的話返回文件描述符瀑构,打開(kāi)失敗的話返回-1
要打開(kāi)的文件由參數(shù)pathname來(lái)標(biāo)識(shí),如果pathname是一個(gè)符號(hào)鏈接刨摩,那么該調(diào)用會(huì)對(duì)其進(jìn)行解引用寺晌。如果調(diào)用成功,open()返回文件描述符澡刹,用于在后續(xù)函數(shù)調(diào)用中指代該文件折剃,如果發(fā)生錯(cuò)誤,則返回-1像屋,并將errno置為相應(yīng)的錯(cuò)誤標(biāo)志怕犁。參數(shù)flags為位掩碼,用來(lái)指定文件的訪問(wèn)模式。 當(dāng)調(diào)用open()創(chuàng)建新文件時(shí)奏甫,位掩碼參數(shù)mode指定了文件的訪問(wèn)權(quán)限戈轿。
如果open()并未指定O_CREAT標(biāo)志,則可以省略mode參數(shù)阵子。 O_RDONLY ---->以只讀方式打開(kāi)文件 O_WRONLY ---->以只寫(xiě)方式打開(kāi)文件 O_RDWR ---->以讀寫(xiě)方式打開(kāi)文件思杯。
open函數(shù)使用的例子:
#include<sys/stat.h>
#include<fcntl.h>
#include "tlpi_hdr.h"
#include "error_functions.h"http://用來(lái)輸入錯(cuò)誤信息
int main(int argc, char const *argv[])
{
int fd;
fd=open("startup",O_RDONLY);
if(fd==-1)
errExit("open");
fd=open("myfile",O_RDWR|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR);
if(fd==-1)
errExit("open");
fd=open("w.log",O_WRONLY|O_CREAT|O_TRUNC|O_APPEND,S_IRUSR|S_IWUSR);
if(fd==-1)
errExit("open");
return 0;
}
open()調(diào)用所返回的文件描述符數(shù)值:SUSv3規(guī)定,如果調(diào)用open()成功挠进,必須保證其返回值為進(jìn)程為用文件描述符中數(shù)值最小者色乾。
所以可以利用這項(xiàng)特性來(lái)以特定的文件描述符打開(kāi)某一個(gè)文件。
例如:下例代碼會(huì)確保使用標(biāo)準(zhǔn)輸入(文件描述符0)打開(kāi)一個(gè)文件
#include<sys/stat.h>
#include<fcntl.h>
#include "tlpi_hdr.h"
#include "error_functions.h"http://用來(lái)輸入錯(cuò)誤信息
int main(int argc, char const *argv[])
{
int fd;
if(close(STDIN_FILENO)==-1)
//close()關(guān)閉STDIN_FILENO 使得系統(tǒng)內(nèi)最小文件描述符為0
errExit("close");
fd=open("startup",O_RDONLY);
if(fd==-1)
errExit("open");
printf("%d\n",fd);
return 0;
}
結(jié)果截圖:
由于文件描述符0未用领突,所以open()調(diào)用勢(shì)必使用此描述符打開(kāi)文件暖璧。
-
open()調(diào)用中的flags參數(shù)
在上述的代碼例子中,flags參數(shù)除了使用文件訪問(wèn)標(biāo)志外君旦,還使用了其他操作標(biāo)志澎办。如下圖所示
這里寫(xiě)圖片描述
這里寫(xiě)圖片描述
上述訪問(wèn)標(biāo)志可以分為三組:
1、文件訪問(wèn)模式標(biāo)志:先前描述的O_RDONLY金砍、O_WRONLY 局蚀、O_RDWR標(biāo)志均在此類(lèi)中,調(diào)用open()時(shí)恕稠,上述三者在flags參數(shù)中不能同時(shí)使用琅绅,只能指定其中一種。 調(diào)用fcntl()的F_GETFL操作可以檢索文件的訪問(wèn)模式鹅巍。
2奉件、文件創(chuàng)建標(biāo)志:這些標(biāo)志位于圖中第二部分,其控制范圍不拘于open()調(diào)用行為的方方面面昆著,還涉及后續(xù)I/O操作的各個(gè)選項(xiàng)县貌。這些操作不能被檢索,也無(wú)法修改凑懂。
3煤痕、已打開(kāi)文件的狀態(tài)標(biāo)志:這些標(biāo)志時(shí)圖中的剩余部分。使用fcntl()的F_GETFL和F_SETFL操作可以分別檢索和修改此類(lèi)標(biāo)志接谨。有時(shí)干脆稱之為文件狀態(tài)標(biāo)志摆碉。
flags常量的詳解:
O_APPEND : 標(biāo)志如其名,總是在文件尾部追加數(shù)據(jù)脓豪。
O_ASYNC : 當(dāng)對(duì)open()調(diào)用所返回的文件描述符可以實(shí)施I/O操作時(shí)巷帝,系統(tǒng)會(huì)產(chǎn)生一個(gè)信號(hào)通知進(jìn)程。這一個(gè)特性扫夜,也被稱之為信號(hào)驅(qū)動(dòng)I/O楞泼,僅對(duì)特定類(lèi)型的文件有效驰徊,諸如終端、FIFO及socket堕阔。在linux中棍厂,調(diào)用open()時(shí)指定O_ASYNC標(biāo)志沒(méi)有任何實(shí)質(zhì)效果,要啟用信號(hào)驅(qū)動(dòng)I/O特性超陆,必須調(diào)用fcntl()的F_SETFL操作來(lái)設(shè)置O_ASYNC標(biāo)志牺弹。
O_CLOEXEC : 為新(創(chuàng)建)的文件描述符啟用close-on-flag標(biāo)志(FD_CLOEXEC)。使用O_CLOEXEC標(biāo)志(打開(kāi)文件)时呀,可以免去程序執(zhí)行fcntl()的F_GETFD和F_SETFD操作來(lái)設(shè)置close-on-exec標(biāo)志的額外工作张漂。----------------------看不懂
O_CREATE : 如果文件不存在,將創(chuàng)建一個(gè)新的空文件谨娜。即使文件以只讀方式打開(kāi)航攒,此標(biāo)志依然有效。如果在open()調(diào)用中指定O_CREATE標(biāo)志瞧预,那么還要提供mode參數(shù)屎债,否則仅政,會(huì)將新文件的權(quán)限設(shè)置為棧中的某個(gè)隨機(jī)值垢油。
O_TRUNC : 如果文件已經(jīng)存在且為普通文件,那么將清空文件內(nèi)容圆丹,將其長(zhǎng)度置為0滩愁。在linux下使用此標(biāo)志,無(wú)論以讀辫封、寫(xiě)方式打開(kāi)文件硝枉,都可清空文件內(nèi)容(在這兩種情況下,都必須擁有對(duì)文件的讀寫(xiě)權(quán)限)倦微。
O_DIRECTORY : 如果pathname參數(shù)并非目錄妻味,將返回錯(cuò)誤(錯(cuò)誤號(hào)errno為ENOTDIR)。這一標(biāo)志是專為實(shí)現(xiàn)opendir()函數(shù)而設(shè)計(jì)的擴(kuò)展標(biāo)志欣福。為使O_DIRECTORY標(biāo)志的常量定義在<fcntl.h>中有效责球,必須定義_GNU_SOURCE功能測(cè)試宏。
open()函數(shù)的錯(cuò)誤
若打開(kāi)文件時(shí)發(fā)生錯(cuò)誤拓劝,open()將返回-1雏逾,錯(cuò)誤號(hào)errno標(biāo)識(shí)錯(cuò)誤原因。以下是可能發(fā)生的錯(cuò)誤
EACCES:文件權(quán)限不允許調(diào)用進(jìn)程以flags參數(shù)指定的方式打開(kāi)文件郑临。無(wú)法訪問(wèn)文件栖博,其可能的原因有目錄權(quán)限的限制、文件不存在并且無(wú)法創(chuàng)建該文件厢洞。
EMFILE:進(jìn)程已打開(kāi)的文件描述符數(shù)量達(dá)到了進(jìn)程資源限制所設(shè)定的上限仇让。
EISDIR:所指定的文件屬于目錄典奉,而調(diào)用者企圖打開(kāi)該文件進(jìn)行寫(xiě)操作。不允許這種用法妹孙,在某些場(chǎng)合中秋柄,打開(kāi)目錄進(jìn)行讀操作是必要的。
ENFILE :文件打開(kāi)數(shù)量已經(jīng)達(dá)到系統(tǒng)允許的上限蠢正。
ENOENT:要么文件不存在且未指定O_CREATE標(biāo)志骇笔,要么指定了O_CREATE標(biāo)志,但pathname參數(shù)所指定路徑的目錄之一不存在嚣崭,或者pathname參數(shù)為符號(hào)鏈接笨触,而該鏈接指向的文件不存在(空鏈接)。
EROFS : 所指定的文件隸屬于只讀文件系統(tǒng)雹舀,而調(diào)用者企圖以寫(xiě)方式打開(kāi)文件芦劣。
Create()系統(tǒng)調(diào)用
在早期的unix系統(tǒng)中,open()只有兩個(gè)參數(shù)说榆,不能用來(lái)創(chuàng)建新文件虚吟,而是使用create()系統(tǒng)調(diào)用來(lái)創(chuàng)建并打開(kāi)一個(gè)新文件。
#include<fcntl.h>
int create(const char * pathname,mode_t mode)
create()系統(tǒng)調(diào)用根據(jù)pathname參數(shù)創(chuàng)建并打開(kāi)一個(gè)文件签财,若文件已存在串慰,則打開(kāi)文件,并清空文件內(nèi)容唱蒸,將其長(zhǎng)度清0邦鲫。create()返回一文件描述符,供后續(xù)系統(tǒng)調(diào)用使用神汹。create()系統(tǒng)調(diào)用等同于如下open()調(diào)用:
fd=open(pathname,O_WRONLY|O_CREATE|O_TRUNC庆捺,mode); 現(xiàn)在一般都使用open()來(lái)代替create()的操作。
讀取文件內(nèi)容:read()
read()系統(tǒng)調(diào)用從文件描述符fd所指代的打開(kāi)文件中讀取數(shù)據(jù)屁魏。
#include<unistd.h>
ssize_t read(int fd,void *buffer,size_t count);
return number of bytes read,0 on EOF ,or -1 on error
count參數(shù)指定最多能讀取的字節(jié)數(shù)滔以,(size_t數(shù)據(jù)類(lèi)型屬于無(wú)符號(hào)整數(shù)類(lèi)型)。buffer參數(shù)提供用來(lái)存放輸入數(shù)據(jù)的內(nèi)存緩沖區(qū)地址氓拼。緩沖區(qū)至少應(yīng)有count個(gè)字節(jié)你画。linux的系統(tǒng)調(diào)用不會(huì)分配內(nèi)存緩沖區(qū)用以返回信息給調(diào)用者。所以披诗,必須預(yù)先分配大小合適的緩沖區(qū)并將緩沖區(qū)指針傳遞給系統(tǒng)調(diào)用撬即。但有些庫(kù)函數(shù)卻會(huì)分配內(nèi)存緩沖區(qū)用以返回信息給調(diào)用者。
如果read()調(diào)用成功呈队,將返回實(shí)際讀取的字節(jié)數(shù)剥槐。如果遇到文件結(jié)束(EOF)則返回0,如果出現(xiàn)錯(cuò)誤則返回-1宪摧。ssize_t數(shù)據(jù)類(lèi)型屬于有符號(hào)的整數(shù)類(lèi)型粒竖,用來(lái)存放(讀取的)字節(jié)數(shù)或-1(表示錯(cuò)誤)颅崩。如果讀普通文件時(shí),在讀到要求字節(jié)數(shù)之前已經(jīng)達(dá)到文件結(jié)尾蕊苗,解決方法如:若達(dá)到文件尾端之前有30個(gè)字節(jié)沿后,而要求讀50個(gè)字節(jié),則第一次read返回?cái)?shù)值為30朽砰,在下次調(diào)用read時(shí)返回0(表示文件讀取完畢)尖滚。
一次read()調(diào)用所讀取的字節(jié)數(shù)可以小于請(qǐng)求的字節(jié)數(shù)。對(duì)于普通文件而言瞧柔,這可能時(shí)因?yàn)楫?dāng)前的讀取位置靠近文件尾部漆弄。
當(dāng)read()應(yīng)用于其他文件類(lèi)型時(shí),比如管道造锅、FIFO撼唾、socket或者終端,在不同環(huán)境下也會(huì)出現(xiàn)read()調(diào)用讀取的字節(jié)小于請(qǐng)求字節(jié)數(shù)的情況哥蔚。
#include<unistd.h>
#include "tlpi_hdr.h"
#include "error_functions.h"
#define MAX_READ 20
int main(int argc, char const *argv[])
{
/* code */
char buffer[MAX_READ+1];
ssize_t numRead=read(STDIN_FILENO,buffer,MAX_READ);
if(numRead==-1)
errExit("read");
buffer[numRead]='\0'; //必須加上這一行倒谷,才能在終端內(nèi)讀取字符。
printf("The input data was :%s\n",buffer);
return 0;
}
read()可以從文件中讀取任意序列的字節(jié)糙箍,有時(shí)讀到的信息可能是文本數(shù)據(jù)渤愁,但有時(shí)可能是二進(jìn)制整數(shù)或二進(jìn)制形式的C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)。read()不能區(qū)分這些數(shù)據(jù)倍靡,所以不能遵從c語(yǔ)言對(duì)字符串處理的約定------在字符串尾部追加標(biāo)識(shí)字符串結(jié)束的空字符猴伶。
所以如果要使用c語(yǔ)言和read()系統(tǒng)調(diào)用课舍,必須在輸入緩沖區(qū)結(jié)尾處顯示追加一個(gè)表示終止的空字符塌西。
數(shù)據(jù)寫(xiě)入文件:write()
write()系統(tǒng)調(diào)用將數(shù)據(jù)寫(xiě)入一個(gè)已經(jīng)打開(kāi)的文件中
#include<unistd.h>
ssize_t write(int fd,void *buffer,size_t count
write()調(diào)用的參數(shù)含義與read()調(diào)用類(lèi)似。buffer參數(shù)為要寫(xiě)入文件中數(shù)據(jù)的內(nèi)存地址筝尾,count參數(shù)為欲從buffer寫(xiě)入文件的數(shù)據(jù)字節(jié)數(shù)捡需,fd參數(shù)為一文件描述符,指代數(shù)據(jù)要寫(xiě)入的文件筹淫。如果write()調(diào)用成功站辉,將返回實(shí)際寫(xiě)入文件的字節(jié)數(shù),該返回值可能小于count參數(shù)值损姜。這被稱為“部分寫(xiě)”饰剥。對(duì)磁盤(pán)文件來(lái)說(shuō),造成"部分寫(xiě)"的原因可能時(shí)因?yàn)榇疟P(pán)已滿摧阅,或是因?yàn)檫M(jìn)程資源對(duì)文件大小的限制汰蓉。
對(duì)磁盤(pán)文件執(zhí)行I/O操作時(shí),wirte()調(diào)用成功并不能保存數(shù)據(jù)已經(jīng)寫(xiě)入磁盤(pán)棒卷。因?yàn)闉榱藴p少磁盤(pán)活動(dòng)量和加快write()系統(tǒng)調(diào)用顾孽,內(nèi)核會(huì)緩存磁盤(pán)的I/O操作祝钢。
關(guān)閉文件:close()
close()系統(tǒng)調(diào)用關(guān)閉一個(gè)打開(kāi)的文件描述符,并將其釋放返回調(diào)用進(jìn)程若厚,供進(jìn)程繼續(xù)使用拦英。當(dāng)一進(jìn)程終止時(shí),將其自動(dòng)關(guān)閉其已打開(kāi)的所有文件描述符测秸。
#include<unistd.h>
int close(int fd);
顯式關(guān)閉不再需要的文件描述符是個(gè)良好的編程習(xí)慣疤估,可以使代碼在后續(xù)修改時(shí)更具有可讀性,也更可靠霎冯。文件描述符屬于有限資源做裙,因此文件描述符關(guān)閉失敗可能會(huì)導(dǎo)致一個(gè)進(jìn)程將文件描述符資源消耗殆盡。要像其他所有系統(tǒng)調(diào)用一樣肃晚,應(yīng)對(duì)close()的調(diào)用進(jìn)行錯(cuò)誤檢查锚贱。
if(close(fd)==-1) errExit("close");
上面這個(gè)錯(cuò)誤提示可以捕獲到的錯(cuò)誤有:嘗試關(guān)閉一個(gè)未打開(kāi)的文件描述符、兩次關(guān)閉同一文件描述符等关串。
- 改變文件偏移量:lseek()
對(duì)于每個(gè)打開(kāi)的文件拧廊,系統(tǒng)內(nèi)核會(huì)記錄其文件偏移量,有時(shí)也將文件偏移量稱為讀寫(xiě)偏移量或指針晋修。文件偏移量是指執(zhí)行下一個(gè)read()或write()操作的文件起始位置吧碾,會(huì)以相對(duì)于文件頭部起始點(diǎn)的文件當(dāng)前位置來(lái)表示。文件第一個(gè)字節(jié)的偏移量為0墓卦。
第一次文件打開(kāi)時(shí)倦春,會(huì)將文件偏移量設(shè)置為指向文件開(kāi)始,以后每次read()或write()調(diào)用將自動(dòng)對(duì)其進(jìn)行調(diào)整落剪,以指向已讀或已寫(xiě)數(shù)據(jù)后的下一字節(jié)睁本。因此,連續(xù)的read()和write()調(diào)用將按順序遞進(jìn)忠怖,對(duì)文件進(jìn)行操作呢堰。
針對(duì)文件描述符fd參數(shù)所指代的已打開(kāi)文件,lseek()系統(tǒng)調(diào)用依照offset和whence參數(shù)值調(diào)整該文件的偏移量凡泣。
#include<unistd.h>
off_t lseek(int fd,off_t offset,int whence) return new file offset if successful ,or -1 on error
offset參數(shù)指定了一個(gè)以字節(jié)為單位的數(shù)值枉疼,whence參數(shù)則表明應(yīng)參照哪個(gè)基點(diǎn)來(lái)解釋offset參數(shù)。
whence參數(shù)應(yīng)為下:
SEEK_SET : 將文件偏移量設(shè)置為從文件頭部起始點(diǎn)開(kāi)始的offset個(gè)字節(jié)鞋拟。----------頭部
SEEK_CUR: 相對(duì)于當(dāng)前文件偏移量骂维,將文件偏移量調(diào)整offset個(gè)字節(jié)摇锋。 --------當(dāng)前位置
SEEK_END:將文件偏移量設(shè)置為起始于文件尾部的offset個(gè)字節(jié)冰单。也就是說(shuō),offset參數(shù)應(yīng)該從文件最后一個(gè)字節(jié)之后的下一個(gè)字節(jié)算起奠蹬。
如果whence參數(shù)值為SEEK_CUR或SEEK_END哮笆,offset參數(shù)可以為正數(shù)也可以為負(fù)數(shù);如果whence參數(shù)值為SEEK_SET来颤,offset參數(shù)值必須為非負(fù)數(shù)汰扭。
lseek()調(diào)用成功會(huì)返回新的文件偏移量。下面的調(diào)用只是獲取文件偏移量的當(dāng)前位置福铅,并沒(méi)有修改它萝毛。
curr=lseek(fd,0,SEEK_CUR)