open
函式可以開啟或建立乙個檔案。
#include
#include
#include
int
open(
const
char
*pathname,
int
flags);
int
open(
const
char
*pathname,
int
flags, mode_t mode);
返回值:成功返回新分配的檔案描述符,出錯返回-1並設定
errno
pathname
引數是要開啟或建立的檔名,和fopen
一樣,pathname
既可以是相對路徑也可以是絕對路徑。
flags
引數有一系列常數值可供選擇,可以同時選擇多個常數用按位或運算子連線起來,所以這些常數的巨集定義都以o_
開頭,表示or。
必選項:以下三個常數中必須指定乙個,且僅允許指定乙個。
以下可選項可以同時指定0個或多個,和必選項按位或起來作為flags
引數。
o_creat
若此檔案不存在則建立它。使用此選項時需要提供第三個引數mode
,表示該檔案的訪問許可權。
o_excl
如果同時指定了o_creat
,並且檔案已存在,則出錯返回。
o_trunc
如果檔案已存在,並且以只寫或可讀可寫方式開啟,則將其長度截斷(truncate)為0位元組。
o_nonblock
對於裝置檔案,以o_nonblock
方式開啟可以做非阻塞i/o(nonblock i/o)。
第三個引數mode
指定檔案許可權,可以用八進位制數表示,比如0644表示-rw-r--r--
,也可以用s_irusr
、s_iwusr
等巨集定義按位或起來表示,詳見open(2)
的man page。要注意的是,檔案許可權由open
的mode
引數和當前程序的umask
掩碼共同決定。
close
函式關閉乙個已開啟的檔案:
#include
int
close(
int
fd);
返回值:成功返回0,出錯返回-1並設定
errno
引數fd是要關閉的檔案描述符。需要說明的是,當乙個程序終止時,核心對該程序所有尚未關閉的檔案描述符
呼叫close關閉,所以即使使用者程式不呼叫close,在終止時核心也會自動關閉它開啟的所有檔案。但是對於一
個長年累月執行的程式(比如網路伺服器),開啟的檔案描述符一定要記得關閉,否則隨著開啟的檔案越來越
多,會占用大量檔案描述符和系統資源。
給個例子:
//
#include
#include
#include
#include
int
main(
int
argc,
const
char
*argv)
編譯:$cc
test
.c
執行:$.
/a
.out
檢視結果:$
umask
0002
$ll
總計 12
-rwxrwxr-x 1 joseph joseph 5085 12-17 10:35 a.out
-rw-rw-r– 1 joseph joseph 0 12-17 10:33 mytest
-rw-rw-r– 1 joseph joseph 263 12-17 10:35
test
.c
以上例子以mode 0666建立乙個檔案mytest,而
umask
是0002,
所以建立的檔案許可權是0666-0002=0664(-rw-rw-r–)。
Linux系統呼叫之open, close
一 open函式可以開啟或建立乙個檔案。include include include int open const char pathname,int flags int open const char pathname,int flags,mode t mode 返回值 成功返回新分配的檔案描述...
linux系統呼叫之檔案系統操作
access 確定檔案的可訪問性 chdir 改變當前工作目錄 fchdir 參見chdir chmod 改變檔案方式 fchmod 參見chmod chown 改變檔案的屬主或使用者組 fchown 參見chown lchown 參見chown chroot 改變根目錄 stat 取檔案狀態資訊 ...
系統呼叫之lseek
注意 這個指標是和檔案描述符相掛鉤的,並不與這個檔案掛鉤,所以可以有多個程序來對這個檔案進行操作,不會影響各自。當從檔案讀取資料時,核心從指標指向的位置開始,讀取指定的位元組數,然後移動指標,指向下乙個未被讀取過的位元組,寫檔案的過程也是類似。off t oldpos lseek int fd,of...