C

跨 exec 的文件描述符

  • December 10, 2015

預設情況下,文件描述符在 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

引用自:https://unix.stackexchange.com/questions/248408