私はしばらくの間、 TTYドライバーがどのように機能するかを理解しようとしてきました(各カーネルの実装は異なる可能性があることを完全に理解しています)。
stdin
ただし、xtermには、、stdout
またはがないと主張していることに気付きましたstderr
。xtermやその他のターミナルエミュレータは、bashやその他の子プロセスから入力を取得して、ウィンドウに出力できるようにする方法を教えてください。ターミナルエミュレータはTTYドライバに接続されていますか?
私はしばらくの間、 TTYドライバーがどのように機能するかを理解しようとしてきました(各カーネルの実装は異なる可能性があることを完全に理解しています)。
stdin
ただし、xtermには、、stdout
またはがないと主張していることに気付きましたstderr
。xtermやその他のターミナルエミュレータは、bashやその他の子プロセスから入力を取得して、ウィンドウに出力できるようにする方法を教えてください。ターミナルエミュレータはTTYドライバに接続されていますか?
、、、またはあまり意味xterm(1)
のない主張は信じられません。そして、その記事をざっと読んだだけで、彼が説明していることをあまり理解していなかったため、図では空白のままになっていると思います。stdin
stdout
stderr
自分の端末のファイル記述子を簡単に確認できます。私が普段使っているurxvt(1)
端末はこんな感じです。
lrwx------ 1 sarnold sarnold 64 2011-11-10 21:33 0 -> /home/sarnold/.xsession-errors
lrwx------ 1 sarnold sarnold 64 2011-11-10 21:33 1 -> /home/sarnold/.xsession-errors
lrwx------ 1 sarnold sarnold 64 2011-11-10 21:33 2 -> /home/sarnold/.xsession-errors
これらの端末xterm(1)
の1つから開始した場合、urxvt(1)
次のようになります。
lrwx------ 1 sarnold sarnold 64 2011-11-15 16:45 0 -> /dev/pts/1
lrwx------ 1 sarnold sarnold 64 2011-11-15 16:45 1 -> /dev/pts/1
lrwx------ 1 sarnold sarnold 64 2011-11-15 16:45 2 -> /dev/pts/1
そして、xterm(1)
ウィンドウマネージャーのdmenu(1)
ランチャーを使い始めたのは次のようになります。
lrwx------ 1 sarnold sarnold 64 2011-11-15 16:46 0 -> /dev/null
lrwx------ 1 sarnold sarnold 64 2011-11-15 16:46 1 -> /home/sarnold/.xsession-errors
lrwx------ 1 sarnold sarnold 64 2011-11-15 16:46 2 -> /home/sarnold/.xsession-errors
stdin
、、について覚えておくべき重要な部分は、ターミナルエミュレータが提供するグラフィック表示stdout
とstderr
は完全に無関係であるということです。ターミナルプログラムが、たとえばを介してエラーを書き込む必要がある場合、その出力は、それを開始したターミナルまたはなどのセッションエラーログに送られる可能性があります。経由でログインし、次のように開始した場合:stderr
perror(3)
~/.xsession-errors
ssh(1)
xterm(1)
DISPLAY=:1 xterm -e 'echo hello ; sleep 10`
起動して表示されますhello
。(あなたのマッチが私のものだと仮定しますDISPLAY
。)コマンドを次のように変更した場合:
DISPLAY=:1 xterm -fn fiddly -e 'echo hello ; sleep 10'
xterm(1)
間違ったフォントに関するエラーメッセージが、独自のグラフィカルインターフェイスではなく、起動したターミナルに送信されることがわかります。(これは少しおかしいです。SHELL
存在しないものに変更したり、存在しないものを実行しようとしたりすると、エラーメッセージが標準エラーではなくグラフィカルウィンドウ内に出力されるためです。)
ターミナルエミュレータでも開いているファイルは次のptmx(4)
とおりです。
lrwx------ 1 sarnold sarnold 64 2011-11-10 21:33 0 -> /home/sarnold/.xsession-errors
lrwx------ 1 sarnold sarnold 64 2011-11-10 21:33 1 -> /home/sarnold/.xsession-errors
lrwx------ 1 sarnold sarnold 64 2011-11-10 21:33 2 -> /home/sarnold/.xsession-errors
lrwx------ 1 sarnold sarnold 64 2011-11-10 21:33 3 -> anon_inode:[eventpoll]
lr-x------ 1 sarnold sarnold 64 2011-11-10 21:33 4 -> pipe:[16398]
l-wx------ 1 sarnold sarnold 64 2011-11-10 21:33 5 -> pipe:[16398]
lrwx------ 1 sarnold sarnold 64 2011-11-10 21:33 6 -> socket:[16399]
lrwx------ 1 sarnold sarnold 64 2011-11-10 21:33 7 -> /dev/ptmx
デバイスを開くとptmx(4)
、ターミナルエミュレータにpipe
PTYマスターとスレーブの接続が提供されます。pipe
ターミナルエミュレータソフトウェアがクライアントおよびカーネルと通信するのは、これらのユーザーです。
tty
レイヤージャスティスはできません。詳細については、Unix環境の高度なプログラミング第2版pty
のセクションを読むことを強くお勧めします。この本(およびソースコードには、プログラムのような機能を実装したり、プログラムが制御するコマンドラインオプションを提供していない場合にブロックバッファリングではなくラインバッファリングを使用するように標準CIOストリームを騙したりするために使用できる独自のドライバを作成することが含まれますこれはネイティブです。pty
script(1)