C
跨 exec 的文件描述符
預設情況下,文件描述符在 exec 函式中保持打開狀態。描述符 0-2 的好處也許是可以理解的。但是是否有一個實際的案例可以讓其他描述符保持打開狀態?是否有任何真正的應用程序依賴於這個事實?
如果您不希望將該 fd 傳遞給已執行的命令,則可以在文件描述符上設置一個標誌(在
open()
:O_CLOEXEC 或更高版本:FD_CLOEXEC 上)。fcntl()
如果您要執行命令,這就是您應該對內部文件描述符執行的操作。
例如,在 shell 中,這就是
ksh93
你所做exec 3< some-file
的。對於以.{ cmd1; cmd2; } 3< file
_cmd1
_ 這是一個很好的做法,但並不總是遵循,因為如果你不這樣做通常並不重要。cmd2``{cmd1 3<&-; cmd2; } 3< file
現在,該功能是否有用。是的,有幾個命令依賴它。
一些命令將文件描述符作為參數,該參數意味著已由呼叫者打開。想到的幾個例子:
xterm
有它的-S
選擇qemu
對於各種各樣的事情flock
(將文件鎖定在呼叫者的 fd 上)- 該
test
命令又名[
它的-t
選項(好的,該test
實用程序現在內置在大多數類似 Bourne 的 shell 中,但仍然有一個test
可以執行的命令)。dialog
需要文件描述符用於使用者的輸入、使用者的輸出和錯誤以及呼叫者的輸入和輸出,因此您可以為此使用額外的 fds。gpg
或者openssl
您可以指定一個文件描述符來傳遞密碼或其他資訊。有許多依賴於它的幫助實用程序(例如,執行的需要可能是使用 setuid/setgid 執行檔以不同使用者或組的身份執行命令的一部分)。
程序替換依賴於它:
在,
diff <(cmd1) <(cmd2)
, 2 個文件描述符(到管道)被傳遞給diff
並通過作為參數傳遞的特殊 /dev/fd/n 打開它們來訪問它們。對於沒有程序替換的 shell,您可以手動執行以下操作:
cm1 | { cmd2 | diff /dev/fd/3 -; } 3<&0