3

私はしばらくの間、 TTYドライバーがどのように機能するかを理解しようとしてきました(各カーネルの実装は異なる可能性があることを完全に理解しています)。

stdinただし、xtermには、、stdoutまたはがないと主張していることに気付きましたstderr。xtermやその他のターミナルエミュレータは、bashやその他の子プロセスから入力を取得して、ウィンドウに出力できるようにする方法を教えてください。ターミナルエミュレータはTTYドライバに接続されていますか?

4

1 に答える 1

1

、、、またはあまり意味xterm(1)のない主張は信じられません。そして、その記事をざっと読んだだけで、彼が説明していることをあまり理解していなかったため、図では空白のままになっていると思います。stdinstdoutstderr

自分の端末のファイル記述子を簡単に確認できます。私が普段使っている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、、について覚えておくべき重要な部分は、ターミナルエミュレータが提供するグラフィック表示stdoutstderrは完全に無関係であるということです。ターミナルプログラムが、たとえばを介してエラーを書き込む必要がある場合、その出力は、それを開始したターミナルまたはなどのセッションエラーログに送られる可能性があります。経由でログインし、次のように開始した場合:stderrperror(3)~/.xsession-errorsssh(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)、ターミナルエミュレータにpipePTYマスターとスレーブの接続が提供されます。pipeターミナルエミュレータソフトウェアがクライアントおよびカーネルと通信するのは、これらのユーザーです。

ttyレイヤージャスティスはできません。詳細については、Unix環境の高度なプログラミング第2版ptyのセクションを読むことを強くお勧めします。この本(およびソースコードには、プログラムのような機能を実装したり、プログラムが制御するコマンドラインオプションを提供していない場合にブロックバッファリングではなくラインバッファリングを使用するように標準CIOストリームを騙したりするために使用できる独自のドライバを作成することが含まれますこれはネイティブです。ptyscript(1)

于 2011-11-16T01:04:51.817 に答える