Io-Redirection
我可以複製輸入文件描述符並將其用於寫入數據嗎?
以下命令複製輸入文件描述符並使用重複的文件描述符將數據從
echo
命令寫入終端。sh-4.2$ 執行 6<&0 sh-4.2$ echo "你好" >&6 你好
這是否意味著我們可以使用輸入文件描述符寫入終端?
這是否意味著我們可以使用輸入文件描述符寫入終端?
當然。您可以使用您擁有的任何打開文件描述符寫入終端(實際上是支持和授權寫入的任何文件或管道或設備或套接字)。您的程式碼的更簡單版本是這樣的:
echo hello >&0
正如您所料,它將“hello\n”發送到 0 指向的任何文件描述符。如果那是你的終端,那就這樣吧。
這是我去年在 stackoverflow 上對類似問題的回答的副本。
由於歷史習慣,您可以寫入終端設備的標準輸入。這是正在發生的事情:
當使用者在類 Unix 系統上登錄終端,或在 X11 下打開終端視窗時,文件描述符 0、1 和 2 連接到終端設備,它們中的每一個都為讀寫打開。儘管事實上一個人通常只從 fd 0 讀取並寫入 fd 1 和 2 ,但情況仍然如此。
這是第 7 版 init.c的程式碼:
open(tty, 2); dup(0); dup(0); ... execl(getty, minus, tty, (char *)0);
這是如何
ssh
做到的:ioctl(*ttyfd, TCSETCTTY, NULL); fd = open("/dev/tty", O_RDWR); if (fd < 0) error("%.100s: %.100s", tty, strerror(errno)); close(*ttyfd); *ttyfd = fd; ... /* Redirect stdin/stdout/stderr from the pseudo tty. */ if (dup2(ttyfd, 0) < 0) error("dup2 stdin: %s", strerror(errno)); if (dup2(ttyfd, 1) < 0) error("dup2 stdout: %s", strerror(errno)); if (dup2(ttyfd, 2) < 0) error("dup2 stderr: %s", strerror(errno));
(
dup2
函式將 arg1 複製到 arg2 中,必要時先關閉 arg2。)這是如何
xterm
做到的:if ((ttyfd = open(ttydev, O_RDWR)) >= 0) { /* make /dev/tty work */ ioctl(ttyfd, TCSETCTTY, 0); ... /* this is the time to go and set up stdin, out, and err */ { /* dup the tty */ for (i = 0; i <= 2; i++) if (i != ttyfd) { IGNORE_RC(close(i)); IGNORE_RC(dup(ttyfd)); } /* and close the tty */ if (ttyfd > 2) close_fd(ttyfd);