1. 程式人生 > 其它 >開啟檔案open()函式的使用方法詳解

開啟檔案open()函式的使用方法詳解

標頭檔案:#include <sys/types.h>    #include <sys/stat.h>    #include <fcntl.h> 定義函式:     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_APPEND 當讀寫檔案時會從檔案尾開始移動, 也就是所寫入的資料會以附加的方式加入到檔案後面. O_NONBLOCK 以不可阻斷的方式開啟檔案, 也就是無論有無資料讀取或等待, 都會立即返回程序之中. O_NDELAY 同O_NONBLOCK. O_SYNC 以同步的方式開啟檔案. O_NOFOLLOW 如果引數pathname 所指的檔案為一符號連線, 則會令開啟檔案失敗. O_DIRECTORY 如果引數pathname 所指的檔案並非為一目錄, 則會令開啟檔案失敗。注:此為Linux2. 2 以後特有的旗標, 以避免一些系統安全問題.  引數mode 則有下列數種組合, 只有在建立新檔案時才會生效, 此外真正建檔案時的許可權會受到umask 值所影響, 因此該檔案許可權應該為 (mode-umaks).

S_IRWXU00700 許可權, 代表該檔案所有者具有可讀、可寫及可執行的許可權. 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 存取錯誤. 附加說明:使用 access()作使用者認證方面的判斷要特別小心, 例如在access()後再作open()空檔案可能會造成系統安全上的問題.
範例

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
main()
{
    int fd, size;
    char s[] = "Linux Programmer!n", buffer[80];
    fd = open("/tmp/temp", O_WRONLY|O_CREAT);
    write(fd, s, sizeof(s));
    close(fd);
    fd = open("/tmp/temp", O_RDONLY);
    size = read(fd, buffer, sizeof(buffer));
    close(fd);
    printf("%s", buffer);
}

執行 Linux Programmer!