C語言中open函式

2021-07-16 19:33:15 字數 3364 閱讀 4282

簡述:#include

int open(const char *pathname, int oflag, ... /* mode_t mode */);

返回值:成功則返回

檔案描述符

,否則返回 -1

對於 open 函式來說,第三個引數(...)僅當建立新檔案時(即 使用了o_creat 時)才使用,用於指定檔案的訪問許可權位(access permission bits)。pathname 是待開啟/建立檔案的路徑名(如 c:/cpp/a.cpp);oflag 用於指定檔案的開啟/建立模式,這個引數可由以下常量(定義於 fcntl.h)通過邏輯或構成。

o_rdonly 唯讀模式

o_wronly 只寫模式

o_rdwr 讀寫模式

開啟/建立檔案時,至少得使用上述三個常量中的乙個。以下常量是選用的:

o_creat 如果指定檔案不存在,則建立這個檔案

o_excl 如果要建立的檔案已存在,則返回 -1,並且修改 errno 的值

o_trunc 如果檔案存在,並且以只寫/讀寫方式開啟,則清空檔案全部內容(即將其長度截短為0)

o_noctty 如果路徑名指向終端裝置,不要把這個裝置用作控制終端。

o_nonblock 如果路徑名指向 fifo/塊檔案/字元檔案,則把檔案的開啟和後繼 i/o(nonblocking mode)

以下三個常量同樣是選用的,它們用於同步輸入輸出

o_dsync 等待物理 i/o 結束後再 write。在不影響讀取新寫入的資料的

前提下,不等待檔案屬性更新。

o_rsync read 等待所有寫入同一區域的寫操作完成後再進行

o_sync 等待物理 i/o 結束後再 write,包括更新檔案屬性的 i/o

open 返回的檔案描述符一定是最小的未被使用的描述符。

如果 name_max(檔名最大長度,不包括'\0')是 14,而我們想在當前目錄下建立檔名長度超過 14 位元組的檔案,早期的 system v 系統(如 svr2)會截斷超出部分,只保留前 14 個位元組;而由 bsd 衍生的(bsd-derived)系統會返回錯誤資訊,並且把 errno 置為 enametoolong。

posix.1 引入常量 _posix_no_trunc 用於決定是否截斷長檔名/長路徑名。如果_posix_no_trunc 設定為禁止截斷,並且路徑名長度超過 path_max(包括 '\0'),或者組成路徑名的任意檔名長度超過 name_max,則返回錯誤資訊,並且把 errno 置為 enametoolong。

open(開啟檔案)

相關函式

read,write,fcntl,close,link,stat,umask,unlink,fopen

標頭檔案#include

#include

#include

定義函式

int open( const char * pathname, int flags);

int open( const char * pathname,int flags, mode_t mode);引數pathname 指向欲開啟的檔案路徑字串。下列是引數flags 所能使用的旗標:

o_rdonly 以唯讀方式開啟檔案

o_wronly 以只寫方式開啟檔案

o_rdwr 以可讀寫方式開啟檔案。

上述三種旗標是互斥的,也就是不可同時使用,但可與下列的旗標利用or(|)運算子組合。

o_creat 若欲開啟的檔案不存在則自動建立該檔案。

o_excl 如果o_creat 也被設定,此指令會去檢查檔案是否存在。檔案若不存在則建立該檔案,否則將導致開啟檔案錯誤。此外,若o_creat與o_excl同時設定,並且欲開啟的檔案為符號連線,則會開啟檔案失敗。

o_noctty 如果欲開啟的檔案為終端機裝置時,則不會將該終端機當成程序控制終端機。

o_trunc 若檔案存在並且以可寫的方式開啟時,此旗標會令檔案長度清為0,而原來存於該檔案的 資料也會消失。

o_nonblock 以不可阻斷的方式開啟檔案,也就是無論有無資料讀取或等待,都會立即返回程序之中。

o_ndelay 同o_nonblock。

o_sync 以同步的方式開啟檔案。

o_nofollow 如果引數pathname 所指的檔案為一符號連線,則會令開啟檔案失敗。

o_directory 如果引數pathname 所指的檔案並非為一目錄,則會令開啟檔案失敗。此為linux2.2以後特有的旗標,以避免一些系統安全問題。引數mode 則有下列數種組合,只有在建立新檔案時才會生效,此外真正建檔案時的許可權會受到umask值所影響,因此該檔案許可權應該為(mode-umaks)。

s_irwxu 00700 許可權,代表該檔案所有者具有可讀、可寫及可執行的許可權。

s_irusr 或s_iread, 00400許可權,代表該檔案所有者具有可讀取的許可權。

s_iwusr 或s_iwrite,00200 許可權,代表該檔案所有者具有可寫入的許可權。

s_ixusr 或s_iexec, 00100 許可權,代表該檔案所有者具有可執行的許可權。

s_irwxg 00070許可權,代表該檔案使用者組具有可讀、可寫及可執行的許可權。

s_irgrp 00040 許可權,代表該檔案使用者組具有可讀的許可權。

s_iwgrp 00020許可權,代表該檔案使用者組具有可寫入的許可權。

s_ixgrp 00010 許可權,代表該檔案使用者組具有可執行的許可權。

s_irwxo 00007許可權,代表其他使用者具有可讀、可寫及可執行的許可權。

s_iroth 00004 許可權,代表其他使用者具有可讀的許可權

s_iwoth 00002許可權,代表其他使用者具有可寫入的許可權。

s_ixoth 00001 許可權,代表其他使用者具有可執行的許可權。若所有欲核查的許可權都通過了檢查則返回檔案描述符,表示成功,只要有乙個許可權被禁止則返回-1。eexist 引數pathname 所指的檔案已存在,卻使用了o_creat和o_excl旗標。

eaccess 引數pathname所指的檔案不符合所要求測試的許可權。

erofs 欲測試寫入許可權的檔案存在於唯讀檔案系統內。

efault 引數pathname指標超出可訪問記憶體空間。

einval 引數mode 不正確。

enametoolong 引數pathname太長。

enotdir 引數pathname不是目錄。

enomem 核心記憶體不足。

eloop 引數pathname有過多符號連線問題。

eio i/o 訪問錯誤。使用access()作使用者認證方面的判斷要特別小心,例如在access()後再作open()空檔案可能會造成系統安全上的問題。

範例#include

#include

#include

#include

main()

執行linux programmer!

C語言 開啟檔案open函式

函式說明 引數mode 則有下列數種組合,只有在建立新檔案時才會生效,此外真正建檔案時的許可權會受到umask 值所影響,因此該檔案許可權應該為 mode umaks s irwxu00700 許可權,代表該檔案所有者具有可讀 可寫及可執行的許可權.s irusr 或s iread,00400 許可...

C語言中fscanf函式

編輯 函式名 fscanf 功 能 從乙個流中執行格式化輸入,fscanf遇到空格和換行時結束,注意空格時也結束。這與 fgets有區別,fgets遇到空格不結束。返回值 整型,成功返回讀入的引數的個數,失敗返回eof 1 用法 1 intfscanf file stream,constchar f...

C語言中fclose函式

fclose是乙個函式名,功能是關閉乙個流。注意 使用fclose 函式就可以把 緩衝區內最後剩餘的資料輸出到核心緩衝區,並釋放 檔案指標和有關的緩衝區。函式原型 int fclose file fp 返回值 如果流成功關閉,fclose 返回 0,否則返回eof 1 如果流為null,而且程式可以...