首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言 open 系統調用詳解:參數標誌位、權限模式、可變參數原型

     編輯:關於C語言

open 原型


int open(const char *path, int flags, ... /* mode_t mode */);

第三個參數 mode 僅在 flags 含 O_CREAT 時需要,故為可變參數函數。

flags 常用值

宏值說明
O_RDONLY0x0000只讀打開
O_WRONLY0x0001只寫打開
O_RDWR0x0002讀寫打開
O_CREAT0x0100不存在則創建
O_EXCL0x0200配合 O_CREAT,文件存在則報錯
O_TRUNC0x0400截斷長度為 0
O_APPEND0x0800追加寫入
O_NONBLOCK0x1000非阻塞模式
O_SYNC0x2000同步寫入(數據直達磁盤)
O_CLOEXEC0x80000exec 時自動關閉

組合使用:open("file", O_WRONLY|O_CREAT|O_TRUNC, 0644)

mode 權限位


#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 可選。

返回值與錯誤處理

  • 成功返回非負整數(文件描述符 fd),失敗返回 -1,errno 設置。
  • 常見錯誤:ENOENT(文件不存在)、EACCES(權限不足)、EMFILE(進程 fd 耗盡)、EINTR(被信號中斷)。

低級 I/O vs 標準 I/O

  • open/read/write/close/lseek:無緩衝,直接系統調用,適合高性能/精確控制。
  • fopen/fread/fwrite/fclose:用戶態緩衝,適合文本處理、可移植性要求高。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved