int open(const char *path, int flags, ... /* mode_t mode */);
第三個參數 mode 僅在 flags 含 O_CREAT 時需要,故為可變參數函數。
| 宏 | 值 | 說明 |
|---|---|---|
| O_RDONLY | 0x0000 | 只讀打開 |
| O_WRONLY | 0x0001 | 只寫打開 |
| O_RDWR | 0x0002 | 讀寫打開 |
| O_CREAT | 0x0100 | 不存在則創建 |
| O_EXCL | 0x0200 | 配合 O_CREAT,文件存在則報錯 |
| O_TRUNC | 0x0400 | 截斷長度為 0 |
| O_APPEND | 0x0800 | 追加寫入 |
| O_NONBLOCK | 0x1000 | 非阻塞模式 |
| O_SYNC | 0x2000 | 同步寫入(數據直達磁盤) |
| O_CLOEXEC | 0x80000 | exec 時自動關閉 |
組合使用:open("file", O_WRONLY|O_CREAT|O_TRUNC, 0644)
#define S_IRUSR 0400 // 用戶讀
#define S_IWUSR 0200 // 用戶寫
#define S_IXUSR 0100 // 用戶執行
#define S_IRGRP 0040 // 組讀
#define S_IWGRP 0020 // 組寫
#define S_IXGRP 0010 // 組執行
#define S_IROTH 0004 // 其他讀
#define S_IWOTH 0002 // 其他寫
#define S_IXOTH 0001 // 其他執行
/* 常用 0644 = S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH */
實際權限 = mode & ~umask。
/* GCC/glibc */
int open(const char *pathname, int flags, ...);
/* MSVC */
int _open(const char *path, int oflag, ...);
/* Borland */
int _RTLENTRY _EXPFUNC open(const char *__path, int __access, ...);
均為可變參數,mode 可選。
errno 設置。ENOENT(文件不存在)、EACCES(權限不足)、EMFILE(進程 fd 耗盡)、EINTR(被信號中斷)。open/read/write/close/lseek:無緩衝,直接系統調用,適合高性能/精確控制。fopen/fread/fwrite/fclose:用戶態緩衝,適合文本處理、可移植性要求高。