Devices

為什麼點擊 TTY 設備只會擷取其他所有字元?

  • January 20, 2015

所以,我遇到了這個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

好吧,一切都顯示在原始終端中,但是我的“點擊”終端(上面的命令正在執行的那個)仍然只能獲取其他字元

哦,是的,我原來的終端仍然壞了(字元出現了,但只有每個其他字元真正到達我的外殼)。

例如,在終端中輸入lsyield ,在“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 提示符下鍵入並按輸入鍵。

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