/dev/fd

概念

/dev/fd/n 提供檔案系統路徑來存取已開啟的 file descriptor n

open("/dev/fd/3", mode)  // 等同於 dup(3)

為什麼需要 /dev/fd?

很多程式只接受檔案路徑,不接受 file descriptor

場景:無法修改的第三方程式

// 第三方函數庫,無法修改
void process_data(const char *filename) {
    int fd = open(filename, O_RDONLY);  // 只認路徑!
    // ...
}
 
// 你想讓它處理已開啟的 fd 3
process_data("/dev/fd/3");  // 用 /dev/fd 解決

場景:Shell 命令只接受檔案路徑

# diff 只能接受檔案路徑作為參數
diff <(ls -l /tmp) <(ls -l /var)
# Shell 展開後實際是:diff /dev/fd/63 /dev/fd/64

dup() vs /dev/fd

特性dup()/dev/fd
用途程式內部複製 fd傳給只認路徑的程式
能否跨程式是(作為路徑參數)
需修改程式碼

實作細節

  • open("/dev/fd/n", mode) 內部等同於 dup(n)