クリックTTYデバイスが他のすべての文字のみをキャプチャするのはなぜですか?

クリック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

うわー、他の生成された端末で実行してみてくださいこんにちは私がプログラムを実行していた元の端末からttyname

それでは、私がこれを行うと何が起こりますかcat /dev/ttys011?わかった、わかった他のすべての役割タイプ。ああ、そうです。元のTTYセッションも破壊されます。

だから私は次を試してみます。

cat /dev/ttys011 | tee /dev/ttys011

まあ、すべて現れる元の端末にありますが、私の「タブ」端末(上記のコマンドを実行している端末)はまだ他のすべての役割

ああ、そうです。私の元の端末はまだ破損しています(文字が表示されますが、実際には他の文字だけが私のシェルに到達します)。

たとえば、端末の「タブ」端末にYieldと入力してls実行した場合。lsl'l' is not a command

ここで何が起こっているのでしょうか?奇妙な行動を予想しましたが、なぜ他のすべての役割キャプチャされましたか?

答え1

シェルまたはフォアグラウンドのすべてのプロセスは、すでに接続されている端末を読み取ります。つまり、/dev/ttys011別のプロセスを開始します。cat 返品同じ端末で同時に読み込んでいます。

これで、端末に同じ入力を配置して競合する2つのプロセスがあります。端末にキーを入力するたびに、待機中のプロセスの1つに渡されます。もう1つのプロセスも読書に興味がありますが、それを読んでください。どの文字がどのプロセスに入るかを定期的にシフトするように見えますが、実際に入力のどの部分がどのプロセスに入るかを予測することは不可能です。すべての入力が1つのプロセスに含まれていても、すべての入力が別のプロセスに含まれていてもよい。その間の何か。

プロセスがすべての入力を受け取るようにするには、cat同じデバイスから同時に他の項目を読み取らないように準備する必要があります。簡単な方法は、sleep 999端末で同様のコマンドを実行することです。sleep待機遅延は期限切れですが、待っている間は何も読もうとしないでください。

注文する:

cat /dev/ttys011 | tee /dev/ttys011

catキャプチャされた入力は元の位置に復元されません。つまり、tee元の読み取りに興味があったプロセス(シェルなど)には渡されず、端末の出力に送信され表示されます。

注:端末名を取得するためにCプログラムや機能は必要ありません。シェルプロンプトに入力してEnterキーを押すttyname()だけです。tty

関連情報