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

Linux C 庫函數速查手冊(二):文件操作、文件內容、權限控制

     編輯:關於C語言

Linux C 庫函數速查手冊(二):文件操作、文件內容、權限控制

接上期,本文聚焦文件相關系統調用與標準庫函數,涵蓋底層 FD 操作、標準流操作、目錄遍歷、權限管理,附 va_list 可變參處理輔助表。

一、系統調用層(<fcntl.h>、<unistd.h>、<sys/stat.h>、<sys/mman.h>)

函數原型核心語義關鍵備註
openint open(const char *path, int flags, mode_t mode)打開/創建文件,返回 fdflags 必含 O_RDONLY/WO/RDWR;mode 僅 O_CREAT 時生效
closeint close(int fd)關閉 fd
readssize_t read(int fd, void *buf, size_t n)讀取 n 字節到 buf返回實際讀取字節數,0=EOF,-1=錯誤
writessize_t write(int fd, const void *buf, size_t n)寫入 n 字節可能部分寫入,需循環
lseekoff_t lseek(int fd, off_t off, int whence)移動文件偏移量whence: SEEK_SET/CUR/END
fsyncint fsync(int fd)強制刷新內核緩衝到磁盤寫關鍵數據前必調用,防掉電丟失
mmapvoid *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t off)文件映射到內存先 fstat 取大小,再映射,操作內存即操作文件
munmapint munmap(void *addr, size_t len)解除映射
ftruncateint ftruncate(int fd, off_t len)截斷/擴展文件長度mmap 前預設大小必調用
fstatint fstat(int fd, struct stat *buf)獲取文件元信息含 size、mtime、mode、inode 等

二、標準 C 庫流操作(<stdio.h>,C99)

函數原型語義備註
fopenFILE *fopen(const char *path, const char *mode)打開流mode: r/r+/w/w+/a/a+ 等
fcloseint fclose(FILE *fp)關閉流並刷新
freadsize_t fread(void *ptr, size_t sz, size_t n, FILE *fp)讀取 n 個 sz 字節塊返回成功塊數
fwritesize_t fwrite(const void *ptr, size_t sz, size_t n, FILE *fp)寫入 n 個 sz 字節塊
fseekint fseek(FILE *fp, long off, int whence)定位流位置同 lseek
ftelllong ftell(FILE *fp)獲取當前偏移
rewindvoid rewind(FILE *fp)定位到流頭等價 fseek(fp,0,SEEK_SET)
fprintfint fprintf(FILE *fp, const char *fmt, ...)格式化寫入流族函數:printf/sprintf/vprintf 等
fscanfint fscanf(FILE *fp, const char *fmt, ...)格式化讀取流
fgetschar *fgets(char *s, int size, FILE *fp)讀一行(含 \n)遇 \n/EOF 停止,保留 \n
fputsint fputs(const char *s, FILE *fp)寫字符串**不寫 \0**
fflushint fflush(FILE *fp)刷新輸出緩衝
filenoint fileno(FILE *fp)獲取底層 fd橋接 stdio 與系統調用

三、文件/目錄權限與管理(<dirent.h>、<sys/stat.h>、<utime.h>)

函數原型語義
removeint remove(const char *path)刪除文件
renameint rename(const char *old, const char *new)重命名/移動
chmodint chmod(const char *path, mode_t mode)修改權限
statint stat(const char *path, struct stat *buf)獲取文件信息(不需打開)
utimeint utime(const char *path, const struct utimbuf *times)修改訪問/修改時間
opendirDIR *opendir(const char *name)打開目錄
readdir_rint readdir_r(DIR *d, struct dirent *e, struct dirent **res)線程安全讀目錄項
closedirint closedir(DIR *d)關閉目錄
getcwdchar *getcwd(char *buf, size_t size)獲取當前工作目錄
chdirint chdir(const char *path)改變工作目錄

四、可變參數輔助(<stdarg.h>)

宏原型步驟
va_startvoid va_start(va_list ap, last)必須最先調用,初始化 ap
va_argtype va_arg(va_list ap, type)按類型取值並推進 ap
va_endvoid va_end(va_list ap)結束,置 ap=NULL

五、工程師生存法則

  1. **系統調用**(open/read/write)無緩衝、原子性強、適合底層控制
  2. **標準流**(fopen/fread/fwrite)帶緩衝、格式化豐富、適合業務邏輯
  3. **混用警示**:同一文件同時用 fd 和 FILE* 需極度小心緩衝區一致性,建議**二選一**
  4. **目錄操作**:opendir → readdir_r 循環 → closedir 三部曲缺一不可
  5. **權限修改**:chmod 需進程有效用戶擁有文件或 CAP_FOWNER
  6. **大文件複製**:避免 fread/fwrite 全讀入內存,用 mmap 或分塊 read/write 循環

掌握這兩張表,Linux 文件編程 90% 場景可「查表寫碼、一把梭」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved