Stdin

Proc stdin 奇怪的行為

  • August 15, 2018

在此處輸入圖像描述

有人可以解釋為什麼會發生這種情況以及如何解決它,以便發送到標準輸入的數據與輸入到標準輸入的數據的行為方式相同。

對於那些看不到 .gif 的人

基本上我有3個終端設置。一個是執行 netcat 伺服器,它是以下命令。

nc -l 127.0.0.1 4000

終端 2 只是執行一個 netcat 客戶端,它是以下命令。

nc 127.0.0.1 4000

當鍵入客戶端時,這基本上意味著將數據輸入到該程序的標準輸入或文件描述符 0。一旦按下輸入鍵,數據就會顯示在伺服器上。這是預期的行為。

有人會期望,如果您從鍵盤以外的其他來源向標準輸入輸入數據,只要您在末尾提供換行符,甚至提供換行符和輸入符,它就可以正常工作。

儘管在執行具有以下命令的終端 3 時情況並非如此。

echo "test\n" > /proc/$pid/fd/0

奇怪的是,來自 echo 的數據甚至顯示在終端 2 中,但它不會被視為鍵盤輸入,因此終端 2 上的客戶端不會向終端 1 上的伺服器發送任何消息。

我的結論是胡說八道。

如果您查看/proc/$PID/fd/0連結,您會看到它指向終端:

# ls -l /proc/11962/fd/0
lrwx------ 1 foo users 64 Aug 15 04:30 /proc/11962/fd/0 -> /dev/pts/15

當您輸出到它時,您不會將輸入傳遞給nc程序,而是輸出到終端。哪個適當地列印您輸出的內容。

它看起來像這樣:

  /proc/$PID/fd/$N   <-------> [            ]
                               [  terminal  ]
[  nc  ] <--------------------> [            ]

不像這樣:

          /proc/$PID/fd/$N  
              |       |
[      ] <-----+       +------> [            ]
[  nc  ] <--------------------> [  terminal  ]

如果程序的文件描述符 0 被打開到文件中,您是否仍然希望寫入/proc/$PID/fd/0顯示為程序的輸入,或者進入打開的文件?

lrwx------ 1 foo users 64 Aug 15 04:36 /proc/11994/fd/0 -> /tmp/testfile

在這種情況下應該echo foo > /proc/11994/fd/0怎麼做?

這裡也一樣。當程序從 fd 中讀取數據時,它會從文件中讀取數據。但是,當您重新打開同一個文件進行寫入時/proc/$PID/fd/$N,您將寫入文件。

您需要使用 TIOCSTI ioctl 或一些類似的機制將數據填充到終端的輸入緩衝區中。見tty_ioctl(4)

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