Hatena::ブログ(Diary)

ソースコード備忘録 このページをアンテナに追加 RSSフィード

サイト移行しました >>>>> プログラミングメモ

2009-07-25 擬似端末と制御端末(さらにちょっと追記)

擬似端末と制御端末(さらにちょっと追記)

| 20:36 | 擬似端末と制御端末(さらにちょっと追記)を含むブックマーク 擬似端末と制御端末(さらにちょっと追記)のブックマークコメント

擬似端末と制御端末

デバイスファイルの端末関係について簡単なまとめ

調べてるうちになんだかごっちゃになってきたので間違いがあるかも

どうにも物理的な実際の端末装置を使ったことがないから少し違和感が・・・・

  • ttyはTeletypeの略語

Teletypeについては→ no title


各端末スペシャルファイル

Nは10進数に置き換えて下さい

各端末の説明は下の方に書きました。

/dev/ttySN ・・・・・ シリアルポート端末
/dev/ptmx  ・・・・・ 擬似端末のマスタ側
/dev/pts/N ・・・・・ 擬似端末のスレイブ側
/dev/console ・・・・・ カーネル起動時の端末
/dev/vcsN、vcsaN ・・・・ 仮想コンソールメモリ
/dev/tty   ・・・・・  現在使っている端末を表す 例$echo hello > /dev/tty等とすればこのコマンドを打った端末に表される
/dev/ttyN  ・・・・・ 仮想コンソール


シリアルポート端末(/dev/ttySN)

シリアルポートに対するデバイスファイル、端末という呼び名がつくのは

ひと頃、シリアルポートの一般用途が端末だったからみたい。

シリアルポート端末にテキストを送るにはコマンドの標準出力を/ev/ttySNにリダイレクトしてあげればいい

例 $echo hello > /dev/ttyS0 等とすればttyS0に対応しているシリアルポートにテキストが送られる

できないときは/dev/ttyS0に書き込み権限がないので書き込み権限を付与する


仮想コンソール(/dev/ttyN)

/dev/tty0は現在の仮想コンソールのエイリアス

例 tty1の仮想コンソールで$echo hello > /dev/tty0 とすると現在の仮想コンソールでテキストが表示される

仮想コンソールについては以前に書いてあるのでそちらへ↓

仮想コンソールの切り替え、Xorgの複数起動 - ソースコード備忘録


カーネル起動時の端末(/dev/console)

rootログインした時や,ネットワーク/ハードウェア周りの

エラーが起こった時などのシステム関連のメッセージが/dev/consoleエラーメッセージとして表示される

カーネル起動時のメッセージは/dev/consoleに対して出力して画面に表示してるのかな?

/dev/consoleを見るにはxconsoleコマンドを使用する(rootで)


擬似端末(マスタ→/dev/ptmx、スレイブ→/dev/pts/N)

ハードウェアと関連付けされていないテキスト端末インターフェースを提供する

擬似端末の使用例 xtermなどの端末エミュレータtelnetサーバなど

実際の使用方法(図)
  telnet <-> ネットワーク <-> telnetd <-> 擬似端末 <-> loginやshell
                                      ↑マスタ     ↑スレイブ
   xterm <-> 擬似端末 <-> loginやshell
          ↑マスタ    ↑スレイブ
実際の使用方法(説明)
  詳しくは下記の参考サイトの上から3つのサイトが詳しく載っています。

  まずxterm等のプロセスが/dev/ptmxをオープン、プロセスに擬似端末マスタ(PTM)のファイルディスクリプタが返され、
  /dev/pts/以下に擬似端末スレーブ(PTS)デバイスが作成される、次に少し飛ばしますけどPTSをオープンする。

  次に今回は端末エミュレータなのでシェル実行させるのにforkして、dupなどで標準入出力をPTSのファイルディスクリプタ
  に変更後シェルを起動、するとPTSはプロセスに対して実端末とまったく同じインターフェースを提供する。

  これで上記の図のような状態になるのでキーボードからの入力はPTSにwriteすればシェルに渡り、
  シェルの出力結果はPTSからPTM側に渡りPTMをreadすれば読み取れる。
  
  PTSにかかれたデータはPTMに対する入力として扱われ、PTMにかかれたデータはPTSに対する入力として扱われる
  (/dev/ptmxは一つしかないファイルだが/dev/ptmxをオープンして得られるファイルディスクリプタはそれぞれ独立のPTM
     であり対応するPTSを各々持つ)


制御端末

Ctrl+C等の制御を受ける端末

Ctrl+C等が押されたときにSIGINTシグナルがその端末を制御端末としている複数のプロセスに送られる

  例 xtermを起動してその中でvlc等を起動したとすると起動したxtermが制御端末になるxtermが制御端末になるとゆうより
     xterm内でttyコマンドを打って返ってきた出力(仮に/dev/pts/0とすると)、この/dev/pts/0が制御端末になる
     各プログラムの制御端末を知るにはps -auxコマンドのttyの値を見ればどの端末が制御端末かわかる


仮想コンソールメモリ(/dev/vcsN、vcsaN)

仮想コンソールのメモリ

仮想コンソールのメモリなので

$cat /dev/vcs1 > foo などとするとスクリーンダンプが取れる

$echo hello > /dev/vcs1 などとすると仮想コンソールのメモリに書き込める

上記のcatコマンドで作成したfooファイルはxxdなどでヘックスダンプしてあげると

/dev/vcs1ならtty1に表示されているテキストと同じことが読み取れる(テキストで開いても一応読み取れるけど)

上記echoコマンドなら/dev/vcs1の場合ならtty1を見てあげると画面に変化があるのが見て取れる


参考サイト

no title

Ctrl-D の話 - Higepon’s blog

プログラマーズマガジン - Linux、UNIXの擬似端末

LinuxControllingTTY ? アクセンスのおまけ

擬似端末 - Wikipedia

no title

仙石浩明の日記: initramfs シェル環境 (initramfs shell environment) でジョブ制御する方法 (aka “can’t access tty; job control turned off” を消す方法)

2006-02-14 - himainuの日記

デバイス・ドライバ