开源 Python java php linux Ubuntu Android 程序员 wordpress mysql 微软 google 云计算 shell apache Firefox Windows nginx 编程 centos

I/O文件描述符

 在man Page中open函數有兩種形式,一種帶兩個參數,一種帶三個參數,其實在C代碼中open函數是這樣聲明的:

 int open(const char *pathname, int flags, ...);
 第三個參數mode指定文件權限,可以用八進制數表示,比如0644表示-rw-r-r–,也可以用S_IRUSR、S_IWUSR等宏定義按位或起來 表示,詳見open(2)的Man Page。 
 要註意的是,文件權限由open的mode參數和當前進程的umask掩碼共同決定。

 最後的可變參數可以是0個或1個,由flags參數中的標誌位決定,見下面的詳細說明。

 pathname參數是要打開或創建的文件名,和fopen一樣,pathname既可以是相對路徑也可以是絕對路徑。

 flags參數有一系列常數值可供選擇,可以同時選擇多個常數用按位或運算符連接起來,所以這些常數的宏定義都以O_開頭,表示or。

 必選項:以下三個常數中必須指定一個,且僅允許指定 
 O_RDONLY 只讀打開 
 O_WRONLY 只寫打開 
 O_RDWR 可讀可寫打開

 選項可以同時指定0個或多個,和必選項按位或起來作為flags參數。可選項有很多,這裏只介紹一部分,其它選項可參考open(2)的Man Page:

 O_APPEND 表示追加。如果文件已有內容,這次打開文件所寫的數據附加到文件的末尾而不覆蓋原來的內容。

 O_CREAT 若此文件不存在則創建它。使用此選項時需要提供第三個參數mode,表示該文件的訪問權限。

 O_EXCL 如果同時指定了O_CREAT,並且文件已存在,則出錯返回。

 O_TRUNC 如果文件已存在,並且以只寫或可讀可寫方式打開,則將其長度截斷(Truncate) 
為0字節。

 O_NONBLOCK 對於設備文件,以O_NONBLOCK方式打開可以做非阻塞I/O(Nonblock I/O),非阻塞I/O在下一節詳細講解。

延伸阅读

评论