為什麼點擊 TTY 設備只會擷取其他所有字元?
所以,我遇到了這個
ttyname
函式(unistd.h)並且不得不對其進行測試。#include <unistd.h> #include <stdio.h> int main(void) { printf("%s\n", ttyname(0)); return 0; }
在我的機器上,它迴響了
/dev/ttys011
。我發現這是一個設備!echo "Hello" > /dev/ttys011
哇,從另一個終端執行它會在我執行程序的原始終端中產生Hello 。
ttyname
那麼當我發生了什麼
cat /dev/ttys011
?好吧,我輸入了所有其他字元。哦耶; 它也打破了原來的 TTY 會話。所以我嘗試以下方法:
cat /dev/ttys011 | tee /dev/ttys011
好吧,一切都顯示在原始終端中,但是我的“點擊”終端(上面的命令正在執行的那個)仍然只能獲取其他字元。
哦,是的,我原來的終端仍然壞了(字元出現了,但只有每個其他字元真正到達我的外殼)。
例如,在終端中輸入
ls
yield ,在“tap”終端中,執行它會給我.ls``l``'l' is not a command
這裡發生了什麼?我會期待奇怪的行為,但為什麼每個其他角色都被擷取?
您的 shell 或前台的任何程序已經在讀取附加到的終端,即
/dev/ttys011
. 然後你啟動了另一個程序,cat
同時也在讀取同一個終端。現在有兩個程序競爭來自終端的相同輸入。每次您在終端中鍵入一個鍵時,它都會被傳遞給一個等待程序。另一個程序也對閱讀感興趣,但是當輪到它閱讀時,就沒有什麼可閱讀的了。即使您似乎觀察到哪些字元進入哪個程序的規則交替,但實際上無法預測輸入的哪些部分將進入哪個程序:它可能是一個的所有輸入,另一個的所有輸入,或者介於兩者之間的任何內容。
如果您希望您的
cat
程序接收所有輸入,則無需安排任何其他內容同時從同一設備讀取。您可以做到這一點的一種簡單方法是sleep 999
在終端中執行類似的東西。sleep
等待延遲到期,但在等待時不應嘗試讀取任何內容。命令:
cat /dev/ttys011 | tee /dev/ttys011
不會將擷取的任何輸入恢復
cat
到其原始位置。也就是說,tee
不會將它傳遞給最初對讀取它感興趣的任何程序(例如你的 shell),它只是將它發送到終端的輸出,這會導致它被顯示。順便說一句:您不需要 C 程序和
ttyname()
獲取終端名稱的函式;您所要做的就是tty
在 shell 提示符下鍵入並按輸入鍵。