linux基礎(chǔ)復(fù)習(xí)(6)文件I/O操作
不帶緩存的文件I/O 操作,主要用到5 個(gè)函數(shù):open、read、write、lseek和close。這里的不帶緩存是指每一個(gè)函數(shù)都只調(diào)用系統(tǒng)中的一個(gè)函數(shù)(不理解這句話的含義)。這些函數(shù)雖然不是ANSI C的組成部分,但是是POSIX 的組成部分。
本文引用地址:http://m.butianyuan.cn/article/201610/305800.htmopen函數(shù)語(yǔ)法要點(diǎn)
|-- #i nclude // 提供類型pid_t的定義
所需頭文件----|-- #i nclude
|-- #i nclude
函數(shù)原型 int open(const char *pathname,flags,int perms)
pathname 被打開(kāi)的文件名(可包括路徑名)
O_RDONLY:只讀方式打開(kāi)文件
O_WRONLY:可寫(xiě)方式打開(kāi)文件
O_RDWR:讀寫(xiě)方式打開(kāi)文件
O_CREAT:如果該文件不存在,就創(chuàng)建一個(gè)新的文件,并用第三個(gè)參數(shù)為其設(shè)置權(quán)限
O_EXCL:如果使用O_CREAT時(shí)文件存在,則可返回錯(cuò)誤消息。這一
函數(shù)傳入值 參數(shù)可測(cè)試文件是否存在
O_NOCTTY:使用本參數(shù)時(shí),如文件為終端
終端不可用open()系統(tǒng)調(diào)用的那個(gè)進(jìn)程的控制終端
O_TRUNC:如文件已經(jīng)存在,并且以只讀或只寫(xiě)成功打開(kāi),那么會(huì)先
全部刪除文件中原有數(shù)據(jù)
O+APPEND:以添加方式打開(kāi)文件,在打開(kāi)文件的同時(shí),文件指針指
向文件的末尾
perms 被打開(kāi)文件的存取權(quán)限,為8進(jìn)制表示法
函數(shù)返回值 成功:返回文件描述符
失?。?1
補(bǔ)述:文件描述符
對(duì)于Linux 而言,所有對(duì)設(shè)備和文件的操作都使用文件描述符來(lái)進(jìn)行的。文件描述符
是一個(gè)非負(fù)的整數(shù),它是一個(gè)索引值,并指向內(nèi)核中每個(gè)進(jìn)程打開(kāi)文件的記錄表。當(dāng)打開(kāi)一
個(gè)現(xiàn)存文件或創(chuàng)建一個(gè)新文件時(shí),內(nèi)核就向進(jìn)程返回一個(gè)文件描述符;當(dāng)需要讀寫(xiě)文件時(shí),
也需要把文件描述符作為參數(shù)傳遞給相應(yīng)的函數(shù)。
通常,一個(gè)進(jìn)程啟動(dòng)時(shí),都會(huì)打開(kāi)3 個(gè)文件:標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)出錯(cuò)處理。這
3 個(gè)文件分別對(duì)應(yīng)文件描述符為0、1 和2(也就是宏替換STDIN_FILENO、STDOUT_FILENO
和STDERR_FILENO)。
基于文件描述符的I/O 操作雖然不能移植到類Linux 以外的系統(tǒng)上去(如Windows),但它
往往是實(shí)現(xiàn)某些I/O操作的惟一途徑,如Linux中低級(jí)文件操作函數(shù)、多路I/O、TCP/IP套接字
編程接口等。同時(shí),它們也很好地兼容POSIX標(biāo)準(zhǔn),因此,可以很方便地移植到任何POSIX平
臺(tái)上?;谖募枋龇腎/O操作是Linux中最常用的操作之一。
read函數(shù)語(yǔ)法要點(diǎn)
所需頭文件 #i nclude
函數(shù)原型 ssize_t read(int fd,void *buf,size_t count)
fd:文件描述符
函數(shù)傳入值 buf:指定存儲(chǔ)器讀出數(shù)據(jù)的緩函數(shù)傳入值 沖區(qū)
count:指定讀出的字節(jié)數(shù)
成功:讀到的字節(jié)數(shù)
函數(shù)返回值 0:已到達(dá)文件尾
-1:出錯(cuò)
write函數(shù)語(yǔ)法要點(diǎn)
所需頭文件 #i nclude
函數(shù)原型 ssize_t write(int fd,void *buf,size_t count)
fd:文件描述符
函數(shù)傳入值 buf:指定存儲(chǔ)器寫(xiě)入數(shù)據(jù)的緩函數(shù)傳入值 沖區(qū)
count:指定讀出的字節(jié)數(shù)
函數(shù)返回值 成功:已寫(xiě)的字節(jié)數(shù)
-1:出錯(cuò)
lseek函數(shù)語(yǔ)法要點(diǎn)
所需頭文件 #i nclude
#i nclude
函數(shù)原型 off_t lseek(int fd,off_t offset,int whence)
fd:文件描述符
函數(shù)傳入值 offset:偏移量,每一讀寫(xiě)操作所需要移動(dòng)的距離
單位是字節(jié)的數(shù)量,可正可負(fù)(向前移,向后移)
whence: SEEK_SET:當(dāng)前位置為文件的開(kāi)頭,新位置為偏移量的大小
當(dāng)前位置 SEEK_CUR:當(dāng)前位置為文件指針的位置,新位置為當(dāng)前位置加上偏移
的基點(diǎn) SEEK_END:當(dāng)前位置為文件的結(jié)尾,新位置為文件的大小加上偏移
函數(shù)返回值 成功:文件的當(dāng)前位移
-1:出錯(cuò)
/*打開(kāi),關(guān)閉,讀寫(xiě)文件.c*/
#i nclude unistd.h>
#i nclude sys/types.h>
#i nclude sys/stat.h>
#i nclude fcntl.h>
#i nclude stdlib.h>
#i nclude stdio.h>
int main(void)
{
int fd; //文件描述符
int i,size,len;
char *buf=Writing to this file!;
char buf_r[10];
len = strlen(buf);
/*調(diào)用open函數(shù),以可讀寫(xiě)的方式打開(kāi),注意選項(xiàng)可以用“|”符號(hào)連接*/
if((fd = open(/tmp/hello.c, O_CREAT | O_TRUNC | O_WRONLY , 0600 ))0){
perror(open:);
exit(1);
}
else{
printf(Open file: hello.c %dn,fd);
}
/*調(diào)用write函數(shù),將buf中的內(nèi)容寫(xiě)入到打開(kāi)的文件中*/
if((size = write( fd, buf, len)) 0){
perror(write:);
exit(1);
}
else
printf(Write:%sn,buf);
/*調(diào)用lsseek函數(shù)將文件指針移到文件起始,并讀出文件中的10個(gè)字節(jié)*/
lseek( fd, 0, SEEK_SET );
if((size = read( fd, buf_r, 10))0){
perror(read:);
exit(1);
}
else
printf(read form file:%sn,buf_r);
if( close(fd) 0 ){
perror(close:);
exit(1);
}
else
printf(Close hello.cn);
exit(0);
}
當(dāng)多個(gè)用戶共同使用、操作一個(gè)文件的情況,這時(shí),Linux 通常采用的方法是給文件上鎖,來(lái)避免共享的資源產(chǎn)生競(jìng)爭(zhēng)的狀態(tài)。
文件鎖包括建議性鎖和強(qiáng)制性鎖。建議性鎖要求每個(gè)上鎖文件的進(jìn)程都要檢查是否有鎖存在,并且尊重已有的鎖。在一般情況下,內(nèi)核和系統(tǒng)都不使用建議性鎖。強(qiáng)制性鎖是由內(nèi)核執(zhí)行的鎖,當(dāng)一個(gè)文件被上鎖進(jìn)行寫(xiě)入操作的時(shí)候,內(nèi)核將阻止其他任何文件對(duì)其進(jìn)行讀寫(xiě)操作。采用強(qiáng)制性鎖對(duì)性能的影響很大,每次讀寫(xiě)操作都必須檢查是否有鎖存在。在Linux 中,實(shí)現(xiàn)文件上鎖的函數(shù)有l(wèi)ock和fcntl,其中flock用于對(duì)文件施加建議性鎖,而fcntl不僅可以施加建議性鎖,還可以施加強(qiáng)制鎖。同時(shí),fcntl還能對(duì)文件的某一記錄進(jìn)行
評(píng)論