Io-Redirection

我可以複製輸入文件描述符並將其用於寫入數據嗎?

  • December 21, 2016

以下命令複製輸入文件描述符並使用重複的文件描述符將數據從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);

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