open()是 Linux/Unix 內(nèi)核提供的底層系統(tǒng)調(diào)用,核心功能是打開或創(chuàng)建文件。成功調(diào)用后,內(nèi)核會返回一個整型的文件描述符作為該文件的句柄,后續(xù)的所有讀寫操作都基于此描述符進(jìn)行。調(diào)用時需指定訪問模式(如O_RDONLY),以決定程序操作文件內(nèi)容的權(quán)限。
?
使用open()函數(shù)前,需要包含以下頭文件:
?
int?open(const?char?*pathname,?int?flags);int?open(const?char?*pathname,?int?flags,?mode_t?mode);
?
表示要打開的文件路徑,可以是絕對路徑或相對路徑。
?
用于指定文件的打開方式,分為互斥模式和可選標(biāo)志兩類。
互斥模式(必須選擇一種):

?
可選標(biāo)志(通過位或|與互斥模式組合):

僅在flags包含O_CREAT時有效,用于設(shè)置新建文件的權(quán)限。
mode_t為32位無符號整數(shù),僅低12位有效,分為四組(共12位):

?
每組3位分別對應(yīng)讀(r=4)、寫(w=2)、執(zhí)行(x=1)權(quán)限。
例如0644表示用戶可讀寫,組用戶和其他用戶只可讀。
?
成功:返回文件描述符(非負(fù)整數(shù))
失敗:返回-1
?
下面通過一個具體的例子展示如何以不同方式打開文件,并輸出對應(yīng)的文件描述符。
在/home/elf/work目錄下新建open.c文件,內(nèi)容如下:
int?main()?{? ??// 只讀打開,不存在則創(chuàng)建,權(quán)限 644? ??int?fd1 =?open("./test1", O_RDONLY | O_CREAT,?0644);? ??? ??// 只讀打開,若存在則清空,權(quán)限 644? ??int?fd2 =?open("./test2", O_RDONLY | O_CREAT | O_TRUNC,?0644);? ??? ??// 讀寫打開,不存在則創(chuàng)建,權(quán)限 664? ??int?fd3 =?open("./test3", O_RDWR | O_CREAT,?0664);? ??? ??// 讀寫打開,若存在則清空,權(quán)限 666? ??int?fd4 =?open("./test4", O_RDWR | O_CREAT | O_TRUNC,?0666);? ??? ??printf("fd1: %d\n", fd1);? ??printf("fd2: %d\n", fd2);? ??printf("fd3: %d\n", fd3);? ??printf("fd4: %d\n", fd4);? ??? ??return?0;}
?
elf@ubuntu:~/work$?gcc open.c -o openelf@ubuntu:~/work$?./open
?
程序運行后,輸出如下:
fd1:?3fd2:?4fd3:?5fd4:?6
?
說明:文件描述符從3開始分配,因為0、1、2通常被系統(tǒng)預(yù)留給標(biāo)準(zhǔn)輸入(stdin)、標(biāo)準(zhǔn)輸出(stdout)和標(biāo)準(zhǔn)錯誤(stderr)。
?
