Linux中C語言open和fopen相關旗標

2021-06-19 14:25:43 字數 3794 閱讀 4216

函式原型:

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

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

作用:以各種方式開啟檔案

返回值:返回開啟的檔案控制代碼,-1 開啟失敗

函式說明引數pathname 指向欲開啟的檔案路徑字串既可以是相對路徑也可以是絕對路徑。flags引數有一系列常數值可供選擇,可以同時選擇多個常數用按位或運算子連線起來,所以這些常數的巨集定義都以o_開頭,表示or

下列是引數flags 所能使用的旗標:

必選項:以下三個常數中必須指定乙個,且僅允許指定乙個。

o_rdonly                 以唯讀方式開啟檔案

o_wronly                以只寫方式開啟檔案

o_rdwr                     以可讀寫方式開啟檔案。上述三種旗標是互斥的,也就是不可同時使用,但可與下列的旗標利用or(|)運算子組合。

以下可選項可以同時指定0個或多個,和必選項按位或起來作為flags引數。

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指定檔案許可權,可以用八進位制數表示,比如0644表示-rw-r--r--,也可以用s_irusrs_iwusr等巨集定義按位或起來表示,引數mode 則有下列數種組合,只有在建立新檔案時才會生效,檔案許可權由openmode引數和當前程序的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 許可權,代表其他使用者具有可執行的許可權。

返回值若所有欲核查的許可權都通過了檢查則返回0 值,表示成功,只要有乙個許可權被禁止則返回-1。

錯誤**eexist 引數pathname 所指的檔案已存在,卻使用了o_creat和o_excl旗標。

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

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

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

einval 引數mode 不正確。

enametoolong 引數pathname太長。

enotdir 引數pathname不是目錄。

enomem 核心記憶體不足。

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

eio i/o 訪問錯誤。

fopen(開啟檔案)

相關函式       fopen,fclose

表頭檔案       #include

定義函式       file * fopen(const char * path,const char * mode);

函式說明        引數path字串包含欲開啟的檔案路徑及檔名,引數mode字串則代表著流形態。

mode有下列幾種形態字串:

r                 開啟唯讀檔案,該檔案必須存在。

r+               開啟可讀寫的檔案,該檔案必須存在。

w                開啟只寫檔案,若檔案存在則檔案長度清為0,即該檔案內容會消失。若檔案不存在則建立該檔案。

w+              開啟可讀寫檔案,若檔案存在則檔案長度清為零,即該檔案內容會消失。若檔案不存在則建立該檔案。

a                 以附加的方式開啟只寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的內容會被保留。

a+               以附加方式開啟可讀寫的檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾後,即檔案原先的內容會被保留。

上述的形態字串都可以再加乙個b字元,如rb、w+b或ab+等組合,加入b字元用來告訴函式庫開啟的檔案為二進位制檔案,而非純文字檔案。

不過在posix系統,包含linux都會忽略該字元。由fopen()所建立的新檔案會具有s_irusr|s_iwusr|s_irgrp|s_iwgrp|s_iroth|s_iwoth(0666)許可權,此檔案許可權也會參考umask值。

返回值檔案順利開啟後,指向該流的檔案指標就會被返回。若果檔案開啟失敗則返回null,並把錯誤**存在errno 中。

linux 中 open和fopen的區別

open和fopen的區別 主要區別是涉及到系統,而不是緩衝。帶f的是標準io,可以移植。不帶f只能在unix linux系統呼叫。open乙個是整數,fopen乙個是指標 file 二者區別大致可以總結為以下幾點 1,fread是帶緩衝的,read不帶緩衝.2,fopen是標準c裡定義的,open...

linux 中 open和fopen的區別

open和fopen的區別 主要區別是涉及到系統,而不是緩衝。帶f的是標準io,可以移植。不帶f只能在unix linux系統呼叫。open乙個是整數,fopen乙個是指標 file 二者區別大致可以總結為以下幾點 1,fread是帶緩衝的,read不帶緩衝.2,fopen是標準c裡定義的,open...

C語言中open函式

簡述 include int open const char pathname,int oflag,mode t mode 返回值 成功則返回 檔案描述符 否則返回 1 對於 open 函式來說,第三個引數 僅當建立新檔案時 即 使用了o creat 時 才使用,用於指定檔案的訪問許可權位 acce...