前言
上一篇文章,主要講了文件描述符的基本知識.這篇,我將會結(jié)合代碼,對上一節(jié)的 open,close函數(shù)進行詳細的講解.
代碼 Git 地址 SuzhenProjects/ApueProject
常用函數(shù)復(fù)習(xí)
-
open打開或者創(chuàng)建一個用來讀/寫的文件 -
read讀取用戶指定的 Input -
write寫入到指定的 Output -
lseek重新定位讀寫游標(biāo)的位置 -
close刪除(關(guān)閉)一個文件描述符
Tips: 通過 man 2 <Command> 可以查詢你系統(tǒng)的這些 API 檔案
Open 函數(shù) int open(const char *path, int oflag, ...);
-
path文件的路徑,如果文件不存在,則返回錯誤 -
oflag打開文件/目錄,所使用的用戶自定義選項-
O_RDONLY只讀 -
O_WRONLY只寫 -
O_RDWR讀/寫 -
O_NONBLOCK打開文件時/讀取數(shù)據(jù)時,不要阻塞調(diào)用 -
O_APPEND追加模式,write的內(nèi)容被追加到文檔的末尾 -
O_CREAT如果文件不存在,open會創(chuàng)建文件 -
O_TRUNC截斷文件,使文件長度為0 -
O_EXCL存在O_CREAT模式時,如果文件存在,會返回錯誤 -
O_SHLOCK自動獲取flock的共享鎖 -
O_EXLOCK自動獲取flock的獨占鎖 -
O_NOFOLLOW打開文件的鏈接時, 會失敗 -
O_SYMLINK運行打開文件的鏈接 -
O_EVTONLY用來監(jiān)視文件是否有改動 -
O_CLOEXEC標(biāo)記為close-on-exec
-
- 擴展參數(shù)
- 可以傳入文件的權(quán)限標(biāo)志 如
0755,0666
- 可以傳入文件的權(quán)限標(biāo)志 如
- 返回值 成功會返回一個正整數(shù),其余均為失敗,需要檢查
errno
Close 函數(shù) int close(int fildes);
-
fildes文件描述符 - 返回值 成功會返回0,其余均為失敗,需要檢查
errno
Tips: 通過
strerror可以將errno轉(zhuǎn)換成可讀的字符串
實戰(zhàn) C++
一般我們使用
open打開一個文件或者目錄后,必須使用close進行釋放,否則會出現(xiàn)資源泄露.
(這就是很多語言內(nèi)的Stream類打開后沒有關(guān)閉,會導(dǎo)致各種問題的原因之一),所以我們一定要記住Open/Close 總是成對的使用
#include <unistd.h>
#include <fcntl.h>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cerrno>
int main(int argc, char **argv) {
constexpr char TargetFile[]{"NewFile.txt"};
int filefd = ::open(TargetFile, O_RDWR | O_CREAT, 0666);
if (filefd < 0) {
printf("open failed ! err :%s\n", strerror(errno));
return 1;
}
printf("open success , fd = %d\n", filefd);
::close(filefd);
return EXIT_SUCCESS;
}
實戰(zhàn) Golang
相比
C++版本調(diào)用的繁瑣,Golang提供了更加人性化的os.OpenFile函數(shù),該函數(shù)有兩個返回值.成功時,返回一個文件指針,錯誤設(shè)置為nil,失敗時,文件指針為nil,此時要讀取錯誤信息,并通知用戶.
package main
import (
"os"
"fmt"
)
const (
NewFile = "NewFile.txt"
)
func main() {
fptr, err := os.OpenFile(NewFile, os.O_RDWR|os.O_CREATE, 0666)
if err != nil{
fmt.Println(err.Error())
return
}
fptr.Close()
}
總結(jié)
C++版本的看懂后,Golang 版本是不是也一目了然了,每行發(fā)生了什么事情,心中都有數(shù)了.我們可以做一個類推,Python 的open,close也一定是這個原理.這些語言封裝了更好的異常處理,方便程序員去處理 open,close 發(fā)生的問題.最重要的一點是 open 和close必須成對的被使用!!!