姓名:王芷若? ? 學(xué)號(hào):19020100180
學(xué)院:電子工程學(xué)院
轉(zhuǎn)載自:https://blog.csdn.net/weixin_44039347/article/details/91606727?utm_source=app&app_version=4.13.0&code=app_1562916241&uLinkId=usr1mkqgl919blen
【嵌牛導(dǎo)讀】:本篇文章整理Linux文件編程相關(guān)知識(shí)點(diǎn)次酌。
【嵌牛鼻子】:文件描述符,文件模式符號(hào)常量
【嵌牛提問】:Linux文件編程是如何進(jìn)行的撕蔼?需要調(diào)用或用到什么函數(shù)羽氮?
【嵌牛內(nèi)容】
-arm-linux文件編程
1或链、linux文件編程概述
(1)文件描述符:Linux中文件分為4種:普通文件、目錄文件档押、鏈接文件澳盐、設(shè)備文件要區(qū)分這些文件就要了解“文件描述符”祈纯;
文件描述符是一個(gè)非負(fù)的整數(shù),他是一個(gè)索引值叼耙,并指向內(nèi)核中每個(gè)進(jìn)程打開文件的記錄表腕窥。當(dāng)打開一個(gè)現(xiàn)存文件或創(chuàng)建一個(gè)新文件時(shí),內(nèi)核就向進(jìn)程返回一個(gè)文件描述符筛婉,當(dāng)需要讀/寫文件時(shí)油昂,也需要把文件描述符作為參數(shù)傳遞給相應(yīng)的函數(shù)。
(2)基本I/O操作
Linux的輸入/輸出(I/O)操作倾贰,通常為5個(gè)方面:打開冕碟,讀取,寫入匆浙,和關(guān)閉
對(duì)應(yīng)的有5個(gè)系統(tǒng)調(diào)用:
open,read,write,close,lseek
所需要的頭文件:
#include <sys/types.h>
#include <unistd.h>
1.open函數(shù)
open函數(shù)的原型如下:
int open(const char *pathname, int flags, mode_t mode)
函數(shù)傳入?yún)?shù)含義如下:
pathname:為字符串安寺,表示被打開的文件名稱,可以包含路徑首尼。
flags :為一個(gè)或多個(gè)標(biāo)志挑庶,表示文件的打開方式,常用標(biāo)志如表所示:
O_RDONLY 只讀方式打開
O_WRONLY 只寫方式打開
O_RDWR 讀/寫方式打開
O_CREAT 如果文件不存在软能,就創(chuàng)建新的文件
O_EXCL 如果使用O_CREAT時(shí)文件存在迎捺,則可返回錯(cuò)誤消息
O_TRUNC 如果文件已存在,且以只讀或只寫成功打開查排,則先全部刪除文件中原有的數(shù)據(jù)
O_APPEND 以添加方式打開文件凳枝,在打開文件的同時(shí),文件指針指向文件的末尾跋核、
注意:在open函數(shù)中岖瑰,flags參數(shù)可以用過“|”組合而成,O_RDONLY,O_WRONLY,O_RDWR這三種方式是互斥的砂代,不可同時(shí)使用蹋订,因此這3個(gè)參數(shù)只能出現(xiàn)一個(gè)。
mode 被打開文件的存取權(quán)限模式刻伊,可以使用八進(jìn)制數(shù)來表示新文件的權(quán)限露戒,也可以采用<sys/stat.h>中定義的符號(hào)常量,當(dāng)打開已有文件時(shí)捶箱,將忽略這個(gè)參數(shù)智什,函數(shù)返回值:成功則返回文件描述符,出錯(cuò)返回-1讼呢。
文件模式符號(hào)常量:
S_IRWXU 00700 所屬用戶讀撩鹿。寫和執(zhí)行權(quán)限
S_IRUSR 00400 所屬用戶讀權(quán)限
S_IWUSR 00200 所屬用戶寫權(quán)限
S_IXUSR 00100 所屬用戶執(zhí)行權(quán)限
S_IRWXG 00070 組用戶讀谦炬,寫和執(zhí)行權(quán)限
S_IRGRP 00040 組用戶讀權(quán)限
S_IWGRP 00020 組用戶寫權(quán)限
S_IXGRP 00010 組用戶執(zhí)行權(quán)限
S_IRWXO 00007 其他用戶讀悦屏,寫和執(zhí)行權(quán)限
S_IROTH 00004 其他用戶讀權(quán)限
S_IWOTH 00002 其他用戶寫權(quán)限
S_IXOTH 00001 其他用戶執(zhí)行權(quán)限
2.read和write函數(shù)
函數(shù)原型如下:
ssize_t read(int fd, void *buf,size_t count)
ssize_t write(int fd,const void *buf, size_t count)
函數(shù)傳入?yún)?shù)含義如下:
fd 文件描述符
buf 指定存儲(chǔ)器獨(dú)處數(shù)據(jù)的緩沖區(qū)
count 指定讀出或?qū)懭氲淖止?jié)數(shù)
3.close函數(shù)
當(dāng)使用完文件時(shí)可以使用close關(guān)閉文件节沦,close會(huì)讓緩沖區(qū)中的數(shù)據(jù)寫回磁盤,并釋放文件所占的資源础爬,close的原型如下:
int close(int fd)
函數(shù)傳入?yún)?shù):fd文件描述符
函數(shù)返回值:若文件順利關(guān)閉則返回0甫贯,發(fā)生錯(cuò)誤則返回-1,并置errno,通常文件在關(guān)閉時(shí)出錯(cuò)是不常見的看蚜,但也不是不可能的情況叫搁,他別是在關(guān)閉通過網(wǎng)絡(luò)訪問的文件時(shí)就會(huì)出現(xiàn)這種情況。
4.lseek函數(shù)
主要用于移動(dòng)文件讀寫指針供炎,主要用于獲取文件大小和拓展文件(先分配空間渴逻、然后再填充內(nèi)容),函數(shù)原型如下:
off_t lseek(int fd, off_t offset, int whence)
參數(shù) fd:文件描述符音诫。
offset:偏移量惨奕,每一讀寫操作所需要移動(dòng)的距離,單位是字節(jié)的數(shù)量竭钝,可正可負(fù)(向前移梨撞,向后移)
whence
(當(dāng)前位置基點(diǎn)): SEEK_SET:當(dāng)前位置為文件的開頭,新位置為偏移量的大小香罐。
SEEK_CUR:當(dāng)前位置為文件指針的位置卧波,新位置為當(dāng)前位置加上偏移量。
SEEK_END:當(dāng)前位置為文件的結(jié)尾庇茫,新位置為文件的大小加上偏移量的大小港粱。
返回值 成功:文件的當(dāng)前位移
-1:出錯(cuò)