文件描述符 (fd) 是進程持有的整數句柄,指向內核 file 結構體。file 結構體包含:
| 操作 | fd 關係 | file 結構體 | 共享屬性 |
|---|---|---|---|
dup/dup2 | 指向同一 file | 同一個 | 偏移量、狀態標志共享,引用計數+1 |
兩次 open | 指向不同 file | 兩個獨立 | 偏移量、標志獨立,引用計數各 1 |
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
dup:返回進程最小未用 fd(同 open)dup2:指定 newfd;若 newfd 已打開則先關閉;若 oldfd == newfd 直接返回
int main() {
int fd = open("somefile", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
int save_fd = dup(STDOUT_FILENO); // 保存標準輸出
dup2(fd, STDOUT_FILENO); // 標準輸出 → somefile
close(fd);
write(STDOUT_FILENO, "This is a test\n", 15); // 寫入文件
dup2(save_fd, STDOUT_FILENO); // 恢復標準輸出
write(STDOUT_FILENO, "This is a test\n", 15); // 寫入終端
close(save_fd);
return 0;
}

save_fd 與 1 指向同一 tty file,引用計數 2cmd > file 實質是 dup2(open("file"), 1)pipe(fd); dup2(fd[1], STDOUT_FILENO); dup2(fd[0], STDIN_FILENO)/dev/nulldup2 關閉 newfd 會關閉底層文件 —— 僅減引用計數,歸零才真關閉dup 與 fcntl(fd, F_DUPFD) —— 後者可指定最小 fdclose-on-exec 標志 —— dup2 不複製此標志,fcntl(fd, F_DUPFD_CLOEXEC) 可設置dup/dup2 是 Unix「一切皆文件」哲學下文件描述符操作的基石。理解 file 結構體共享語義與引用計數機制,是掌握重定向、管道、進程間文件傳遞的鑰匙。