-
對(duì)于內(nèi)核而言辐棒,所有打開(kāi)的文件都通過(guò)文件描述符引用,文件描述符是一個(gè)非負(fù)整數(shù)
文件描述符 標(biāo)準(zhǔn) 符號(hào)常量 文件描述符0 標(biāo)準(zhǔn)輸入 STDIN_FILENO 文件描述符1 標(biāo)準(zhǔn)輸出 STDOUT_FILENO 文件描述符2 標(biāo)準(zhǔn)錯(cuò)誤 STDERR_FILENO -
函數(shù)open和openat---打開(kāi)文件
int open(const char *path, int oflag, .../*mode_t mode*/) int openat(int fd,const char *path, int oflag, .../*mode_t mode*/) 兩函數(shù)的返回值:若成功匙赞,返回文件描述符冶匹,若出錯(cuò)撒蟀,返回-1
- path---要打開(kāi)或創(chuàng)建文件的名字
- oflag---用來(lái)說(shuō)明此函數(shù)的多個(gè)選項(xiàng)
- fd---把open和openat函數(shù)區(qū)分開(kāi),有下列三種情況
- path參數(shù)指定的是絕對(duì)路徑名许溅,在這種情況下瓤鼻,fd參數(shù)被忽略,openat函數(shù)相當(dāng)于open
- path參數(shù)指定的是相對(duì)路徑名贤重,fd參數(shù)指出了相對(duì)路徑名在文件系統(tǒng)中的開(kāi)始地址茬祷。fd參數(shù)是通過(guò)打開(kāi)相對(duì)路徑名所在的目錄來(lái)獲取
- path參數(shù)指定的是相對(duì)路徑名,fd參數(shù)具有特殊值A(chǔ)T_FDCWD并蝗。在這種情況下祭犯,路徑名在當(dāng)前工作目錄中獲取,openat函數(shù)在操作上和open函數(shù)相似
-
函數(shù)creat---創(chuàng)建文件
int creat(const char *path, mode_t mode) 返回值:若成功滚停,返回為只寫(xiě)打開(kāi)的文件描述符沃粗。若出錯(cuò),返回-1
-
函數(shù)close---關(guān)閉文件
int close(int fd) 返回值:若成功铐刘,返回0陪每。若出錯(cuò)影晓,返回-1
- 關(guān)閉一個(gè)文件時(shí)會(huì)釋放該進(jìn)程加在改文件上的所有記錄鎖
-
函數(shù)lseek---顯示地為一個(gè)打開(kāi)文件設(shè)置偏移量
off_t lseek(int fd, off_t offset, int whence) 返回值:若成功镰吵,返回新的文件偏移量。若出錯(cuò)挂签,返回-1
對(duì)參數(shù)offset的解釋和參數(shù)whence的值有關(guān)
- 若whence = SEEK_SET,則將該文件的偏移量設(shè)置為距文件開(kāi)始處offset個(gè)字節(jié)
- 若whence = SEEK_CUR,則將該文件的偏移量設(shè)置為其當(dāng)前值加offset疤祭,offset可正可負(fù)
- 若whence = SEEK_END,則將該文件的偏移量設(shè)置為文件長(zhǎng)度加offset,offset可正可負(fù)
-
函數(shù)read---讀數(shù)據(jù)
ssize_t read(int fd, void *buf,size_t nbytes) 返回值:讀到的字節(jié)數(shù),若已到文件尾饵婆,返回0勺馆。若出錯(cuò),返回-1
- 有多種情況可使實(shí)際讀到的字節(jié)數(shù)少于要求讀的字節(jié)數(shù)
-
函數(shù)write---寫(xiě)數(shù)據(jù)
ssize_t write(int fd, const void *buf,size_t nbytes) 返回值:若成功侨核,返回已寫(xiě)的字節(jié)數(shù)草穆。若出錯(cuò),返回-1
單個(gè)進(jìn)程打開(kāi)文件時(shí)內(nèi)核數(shù)據(jù)結(jié)構(gòu)圖
- 兩個(gè)獨(dú)立進(jìn)程各自打開(kāi)了同一個(gè)文件搓译,有如下關(guān)系圖
多個(gè)進(jìn)程讀取同一文件都能正常工作悲柱。每個(gè)進(jìn)程都有它自己的文件表項(xiàng),其中也有它自己的當(dāng)前文件偏移量些己。但是豌鸡,當(dāng)多個(gè)進(jìn)程寫(xiě)同一個(gè)文件時(shí),則可能產(chǎn)生預(yù)想不到的結(jié)果
原子操作指的是由多步組成的一個(gè)操作段标,如果原子操作被執(zhí)行涯冠,要么執(zhí)行完所有步驟,要么一步也不執(zhí)行逼庞,不可能執(zhí)行所有步驟中的一個(gè)子集
-
函數(shù)dup和dup2---復(fù)制一個(gè)現(xiàn)有的文件描述符
int dup(int fd) int dup2(int fd,int fd2); 返回值:若成功蛇更,返回新的文件描述符。若出錯(cuò),返回-1
- fd---將要復(fù)制的文件描述符
- fd2---指定新描述符的值(將要返回的)
- dup返回的新文件描述符一定是當(dāng)前可用文件描述符中的最小數(shù)值
- dup2是一個(gè)原子操作派任,
close(fd2); fcntl(fd,F_DUPFD,fd2);
-
函數(shù)fcntl---改變打開(kāi)已經(jīng)打開(kāi)的文件的屬性
int fcntl(int fd, int cmd, .../* int arg */) 返回值:若成功共耍,則依賴于cmd。若出錯(cuò)吨瞎,返回-1
- fcntl有以下5中功能
- 復(fù)制一個(gè)已有的描述符(cmd = F_DUPFD 或 F_DUPFD_CLOEXEC)
- 獲取/設(shè)置文件描述符標(biāo)志(cmd = F_GETFD 或 F_SETFD)
- 獲取/設(shè)置文件狀態(tài)標(biāo)志(cmd = F_GETFL 或 F_SETFL)
- 獲取/設(shè)置異步I/O所有權(quán)(cmd = F_GETOWN 或 F_SETOWN)
- 獲取/設(shè)置記錄鎖(cmd = F_GETLK痹兜、F_SETLK 或 F_SETLKW)
- 在修改文件描述符標(biāo)志或文件狀態(tài)標(biāo)志時(shí)必須謹(jǐn)慎,先要獲得現(xiàn)在的標(biāo)志值颤诀,然后按照期望修改字旭,最后設(shè)置新標(biāo)志值。不能只執(zhí)行F_SETFD或F_SETFL命令崖叫,這樣會(huì)關(guān)閉以前設(shè)置的標(biāo)志位
- fcntl有以下5中功能