功能:打開(可能是建立)檔案或裝置。
頭檔案: #include
#include
#include
函數原型: int open(const char* pathname,int flags);
int open(const char* pathname,int flags,mode_t mode);
int creat(const char* pathname,mode_t mode);
參數釋義: pathname:表示檔案路徑的字元串。
flags:對檔案的通路标記(access flags)
flags必須包含下列三個中的一個O_RDONLY、O_WRONLY、O_RDWR(分别表示隻讀、隻寫、讀寫),此外0個或多個檔案建立flags或檔案狀态flags可以異或到flags中,檔案建立flags和檔案狀态flags的差別是檔案狀态flags可以通過fcntl()函數來修改,而檔案建立flags則不行。下面列出檔案建立flags和檔案狀态flags的清單:
O_APPEND:追加方式,每次寫之前,檔案都會定位到末尾。注意:NFS檔案系統中,不能同時有好幾個程序對同一個檔案追加資料,因為NFS檔案系統不支援追加方式。
O_ASYNC:信号驅動輸入輸出方式,當每次輸入或輸出準備就緒後,産生一個信号。這種方式僅适用于終端、僞終端、socket、管道、fifo。
O_CREAT:建立方式,如果pathname所指定的檔案不存在,則建立一個新的檔案。此新檔案的user id是執行此操作的程序user id,此新檔案的group id或者是執行此操作的程序的group id,或者是父目錄的group id(由檔案系統類型、挂載選項、父目錄的mode來決定)。
O_DIRECT:最小化cache作用的方式。這種方式是系統的cache作用最小發揮,這可能會影響程序的性能,但是對于某些特定場景比較适合(比如,自己完成cache,而不需要系統自動完成)。
O_DIRECTORY:如果pathname是目錄,則open函數失敗。這個标記是linux特有的,是為了避免opendir在fifo或tape device上調用時的denial of service問題。
O_EXCL:當和O_CREAT一起使用的時候,若檔案已經存在(隻要檔案的符号連結存在即可,無論這個符号連結指向何處),則open函數執行失敗。在NFS檔案系統裡,O_EXCL遭到破壞。當通過O_EXCL來完成加鎖任務時,會存在race condition問題。通過O_EXCL完成加鎖操作的過程是這樣的:建立一個唯一的檔案,然後通過link()函數與這個檔案建立連接配接,若link()函數傳回0,則加鎖成功,否則,用在此檔案上使用stat()函數,假如這個檔案的連結數增大到2,也說明加鎖成功。
O_LARGEFILE:允許打開的檔案是大檔案(其大小不能用off_t表示,而是用off64_t表示)。
O_NOATIME:當對檔案進行讀操作時,不更新檔案的最後通路時間。這個标記多用在索引或備份程式中,使用這個标記可以減少磁盤操作次數,進而提高效率。這個操作不是對所有的檔案系統都适用,NFS檔案系統就不适用,因為NFS檔案系統是在伺服器端控制最後通路時間。
O_NOCTTY:如果pathname指向的是終端裝置,那麼此終端不會成為程序的控制終端(即使此程序沒有控制某個終端)。
O_NOFOLLOW:如果pathname是符号連結,那麼open函數執行失敗。pathname前部的符号連結還是可以被跟蹤的。
O_NONBLOCK或O_NDELAY:如果一個檔案用nonblock方式打開,則無論是open操作,還是其後作用于這個檔案上的其他操作,都不會阻塞等待,而後立即傳回。
O_SYNC:同步方式。在對這個檔案的寫操作完成之前,不能對這個檔案進行其他的操作。
O_TRUNC:如果要打開的檔案已經存在,并且是一個普通檔案,并且打開方式允許寫操作,那麼這個檔案的長度會被截斷成0.對于FIFO和終端,O_TRUNC被忽略。
在打開檔案之後,上面有些flags可以通過調用fcntl()來修改。
mode參數:當一個檔案被建立時,mode參數指定這個檔案的通路權限。可以通過umask()來改變檔案的通路權限,一般情況下,檔案的通路權限是mode&~umask。mode可以使用下面的符号常量:
S_IRWXU (00700) 本使用者有讀、寫、執行的權限。
S_IRUSR (00400)本使用者有讀的權限。
S_IWUSR (00200) 本使用者有寫的權限。
S_IXUSR (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) 其他使用者有執行的權限。
flags使用O_CREAT時,必須使用mode參數,其他情況可忽略。
creat()函數等價于将flags設定成O_CREAT|O_WRONLY|O_TRUNC時的open()。
傳回值: open()函數和creat()函數執行失敗時,都将傳回-1,執行成功是将傳回檔案的描述符。此描述符是一個小的、非負的整數,此描述符是本程序中未使用的數值最小的檔案描述符。這個描述符其實是一個表的entry,這個表記錄了檔案的offset和status,是一個系統級的表。當pathname所指向的檔案被删,或者pathname指向其他的檔案時,都不會影響這個entry(檔案描述符)。