Slide 1

Slide 1 text

端末とシグナル 端末とシグナル とみたまさひろ 1

Slide 2

Slide 2 text

新しい技術にはついていけないので 古いけど今でも役に立ちそうな立たなそうな 技術について語るコーナー 2

Slide 3

Slide 3 text

端末とシグナル 端末とシグナル 3

Slide 4

Slide 4 text

Q. Ctrl-C を押すとプログラムが止まるのは何故? 4

Slide 5

Slide 5 text

A. SIGINT シグナルがプログラムに送られるから 5

Slide 6

Slide 6 text

Q. シグナルを発行してるのは誰? 6

Slide 7

Slide 7 text

A. カーネル(端末ドライバ) 7

Slide 8

Slide 8 text

端末 端末 8

Slide 9

Slide 9 text

端末? 端末? RLogin Tera Term PuTTY xterm これらは「端末エミュレータ」 「物理的な端末」のエミュレータ 9

Slide 10

Slide 10 text

端末(物理) 端末(物理) https://ja.wikipedia.org/wiki/VT100 10

Slide 11

Slide 11 text

VT100(物理) VT100(物理) 1978年 80桁 x 24行 高機能 かなり人気だったらしい デファクトスタンダード たいていの端末エミュレータでサポート 11

Slide 12

Slide 12 text

昔はシリアルポートに端末をつないでいた RS-232C https://ja.wikipedia.org/wiki/RS-232 12

Slide 13

Slide 13 text

RS-232C RS-232C 7bit / 8bit のデータの送受信 アナログ通信 双方で通信速度を合わせる必要がある エラー訂正などもない パリティビットによるエラー検出は可能 13

Slide 14

Slide 14 text

端末で「A」キーを押すと 0x41 データがホストに送信される ホストが 0x41 データを送信すると 端末に「A」が表示される 14

Slide 15

Slide 15 text

端末で送受信するデータは基本的に文字 端末で送受信するデータは基本的に文字 0 1 2 3 4 5 6 7 0 NUL DLE SP 0 @ P ` p 1 SOH DC1 ! 1 A Q a q 2 STX DC2 ” 2 B R b r 3 ETX DC3 # 3 C S c s 4 EOT DC4 $ 4 D T d t 5 ENQ NAK % 5 E U e u 6 ACK SYN & 6 F V f v 7 BEL ETB ’ 7 G W g w 8 BS CAN ( 8 H X h x 9 HT EM ) 9 I Y i y A LF SUB * : J Z j z B VT ESC + ; K [ k { C FF FS , < L \ l | D CR GS - = M ] m } E SO RS . > N ^ n ~ F SI US / ? O _ o DEL 豆: SHIFT + 31-3B → 21-2B / SHIFT + 2C-2F → 3C-3F / SHIFT + 40-5E → 60-7E / CTRL + 40-5F → 00-1F (日本語キーボードの場合) 15

Slide 16

Slide 16 text

文字しか送受信できないなら 文字しか送受信できないなら 矢印キーとかファンクションキーの入力は? 画面上の任意の位置にカーソルを移動するには? 色を変えるには? 16

Slide 17

Slide 17 text

エスケープシーケンス エスケープシーケンス ESC + いくつかの文字の組み合わせで一つの機能を表現 xterm の場合: 右矢印キー(kcuf1) : ESC O C カーソル位置移動(cup) : ESC [ row ; col H 文字色変更(setaf) : ESC [ 3 color m エスケープシーケンスは端末によって異なる 17

Slide 18

Slide 18 text

terminfo データベース terminfo データベース 端末ごとのエスケープシーケンスを定義 infocmp コマンドで現在の端末の情報を出力 % infocmp # Reconstructed via infocmp from file: /lib/terminfo/x/xterm-256color xterm-256color|xterm with 256 colors, am, bce, ccc, km, mc5i, mir, msgr, npc, xenl, colors#0x100, cols#80, it#8, lines#24, pairs#0x10000, acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l, clear=\E[H\E[2J, cnorm=\E[?12l\E[?25h, cr=\r, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A, cvvis=\E[?12;25h, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, flash=\E[?5h$<100/>\E[?5l, home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=\n, indn=\E[%p1%dS, ... 18

Slide 19

Slide 19 text

TERM環境変数 TERM環境変数 現在の端末=TERM環境変数の値 端末の機能を使いたいプログラムはTERMの値から 現在の端末名を得てterminfoデータベースを参照 使ってる端末とTERM変数の値を合わせておかない と動きがおかしくなる 19

Slide 20

Slide 20 text

おまけ おまけ tput コマンドでエスケープシーケンスを出力できる シェルスクリプトでエスケープシーケンスを出力したい ときとかに便利 % tput setaf 1 | od -tx1c 0000000 1b 5b 33 31 6d 033 [ 3 1 m 0000005 20

Slide 21

Slide 21 text

端末の機能 端末の機能 21

Slide 22

Slide 22 text

行編集 行編集 改行するまではプログラムにデータは渡さない BS(0x08)またはDEL(0x7F)で一文字消したり Ctrl-W(0x17)で単語を消したり Ctrl-U(0x15)で行削除したり Ctrl-D(0x04)で入力を終わらせたり 矢印キーやCtrl-A,B,E,Fでの移動とかはできない % cat abcdefg⏎ ← 入力 abcdefg 22

Slide 23

Slide 23 text

シグナル シグナル Ctrl-C でプログラムが終了する (SIGINT) Ctrl-\ でコアダンプして終了する (SIGQUIT) フロー制御 フロー制御 Ctrl-S で出力停止 Ctrl-Q で再開 23

Slide 24

Slide 24 text

stty - 端末の設定 stty - 端末の設定 Ctrl-C でも Ctrl-D でも終わらなくする % stty -a speed 38400 baud; rows 24; columns 80; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ; eol2 = ; swtch = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0; -parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts -ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany imaxbel -iutf8 opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc % stty intr undef eof undef % cat 24

Slide 25

Slide 25 text

stty ixany stty ixany Ctrl-S で停止した後、任意のキーで再開 stty stop undef stty stop undef Ctrl-S で停止しなくなる bash 等で Ctrl-R と組み合わせてヒストリ検索できる 25

Slide 26

Slide 26 text

stty -echo stty -echo エコーバックしない パスワードの入力とかにいいかも % echo -n "Password: "; stty -echo; read pw; stty echo; echo "\nyour password is $pw" Password: (入力が見えない) your password is hoge hoge % 26

Slide 27

Slide 27 text

stty -icanon stty -icanon 行編集モードオフ 1バイトずつプログラムに渡される % ruby -e 'loop{puts $stdin.read(1)}' abcd⏎ ← 入力 a b c d % stty -icanon; ruby -e 'loop{puts $stdin.read(1)}' aa bb cc dd 27

Slide 28

Slide 28 text

その他の端末絡みのシグナル その他の端末絡みのシグナル SIGHUP 端末が切断された時にプロセスに対して送られる デフォルト動作は終了なので何もしてなければプロ セスが終了する デーモンにファイルをリロードさせる用途はどこ由 来なんだろう 28

Slide 29

Slide 29 text

SIGTSTP Ctrl-Z で停止した時に送られる デフォルト動作は Stop SIGCONT fg / bg で再開した時に送られる デフォルト動作は Continue SIGTSTP を無視すると Ctrl-Z で止まらなくなる % bash -c 'trap "" SIGTSTP; sleep 9999' ^Z^Z^Z 29

Slide 30

Slide 30 text

SIGWINCH 端末の画面サイズが変更されたときにプロセスに対 して送られる デフォルト動作は無視 画面サイズが変更されたことをプログラムが知るこ とができる vim など画面サイズが動作に影響するプログラムで 使用される % ruby -e 'trap(:SIGWINCH){p :SIGWINCH}; sleep' :SIGWINCH ← 画面サイズが変更する度に出力される :SIGWINCH :SIGWINCH 30

Slide 31

Slide 31 text

おわり おわり 31