| 維度 | 標準 I/O (stdio) | 系統 I/O (syscall) |
|---|---|---|
| 可移植性 | 高 (ANSI C) | 較低 (POSIX) |
| 性能 | 用戶態緩衝,較慢 | 直達內核,較快 |
| 功能豐富度 | 基礎 | 完整 (非阻塞、異步、鎖、屬性...) |
非負整數,內核為每個進程維護的打開文件表索引。0=stdin, 1=stdout, 2=stderr。上限 ulimit -n (預設 1024)。

fork 繼承、Unix 域套接字傳遞)open(const char *path, int flags, mode_t mode)flags 必選 (三選一): O_RDONLY, O_WRONLY, O_RDWR flags 可選 (位或): O_CREAT // 不存在則創建,需提供 mode O_APPEND // 追加寫入 O_TRUNC // 截斷為 0 O_EXCL // 配合 O_CREAT,文件存在則報錯 O_NONBLOCK // 非阻塞模式 O_SYNC // 同步寫入 (數據+元數據) O_DIRECT // 繞過頁面緩衝 O_CLOEXEC // exec 時自動關閉 (安全) mode: 八進制權限 (如 0644),實際權限 = mode & ~umask
close(int fd)釋放描述符,引用計數歸零時才真正關閉底層對象。
read(int fd, void *buf, size_t count) / write(int fd, const void *buf, size_t count)lseek(int fd, off_t offset, int whence)移動文件偏移量。whence: SEEK_SET, SEEK_CUR, SEEK_END。返回新偏移量。支援 64 位 (off_t),可建立稀疏文件。
多步驟合為單一不可中斷操作,避免競態條件。
tmpnam():不原子,僅生成唯一名稱,創建時可能被搶佔tmpfile():原子,內核直接創建並打開,返回 FILE*,關閉時自動刪除fcntlstruct flock { short l_type; short l_whence; off_t l_start; off_t l_len; pid_t l_pid; };
fcntl(fd, F_SETLK, &lock); // 非阻塞加鎖
fcntl(fd, F_SETLKW, &lock); // 阻塞加鎖
fcntl(fd, F_GETLK, &lock); // 測試鎖
記錄鎖 (Record Locking):支援字節範圍共享/排他鎖,建議性 (advisory),需協作進程遵守。
dup(int oldfd):返回最小可用新描述符dup2(int oldfd, int newfd):原子指定新描述符,若 newfd 已打開則先關閉實現輸出重定向:
int fd = open("log.txt", O_WRONLY|O_CREAT|O_TRUNC, 0644);
dup2(fd, STDOUT_FILENO); // 將 stdout (1) 重定向到 fd
close(fd);
printf("這行會寫入 log.txt\n");
ioctl 與 /dev/fdioctl(fd, request, ...):設備專用控制命令 (如終端屬性、磁碟幾何、網卡配置)/dev/fd/N:打開等同於 dup(N),Shell 重定向常用 (cmd /dev/fd/3 3<input)time 命令$ time ./mycp large.iso copy.iso real 1m30.014s // 用戶等待總時間 user 0m0.003s // 用戶態 CPU 時間 sys 1m29.003s // 內核態 CPU 時間 (系統調用開銷)
緩衝區大小權衡:過小 → 系統調用頻繁;過大 → 記憶體壓力、缺頁中斷。典型 4KB-64KB。