Hacking Ctrl-C

502 Views

March 07, 15

スライド概要

僕らがCtrl-Cを入力すると、誰がINTシグナルを作るのだろうか。

profile-image

サイボウズ・ラボ株式会社で教育向けのOSやCPU、コンパイラなどの研究開発をしています。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

Hacking Ctrl-C @uchan_nos 2015/03/06

2.

Ctrl-C  アプリを止めるのに使う  SIGINT を発生させる _人人人人人人人人人人人人_ > 誰がSIGINTを作るのか <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄

3.

端末とプロセス 端末ドライバ プロセス /dev/tty /dev/pts/* bash uchida@usvr14:infra$ lsof -p 29542(ログインシェルのPID) COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 29542 uchida 0u CHR 136,7 0t0 10 /dev/pts/7 bash 29542 uchida 1u CHR 136,7 0t0 10 /dev/pts/7 bash 29542 uchida 2u CHR 136,7 0t0 10 /dev/pts/7 bash 29542 uchida 255u CHR 136,7 0t0 10 /dev/pts/7

4.

端末ラインディシプリン ユーザプロセス(bashなど) read/write関数 端末ラインディシプリン 端末装置ドライバ Ctrl-C (0x03) 文字が来たら INT シグナルを生成 Ctrl-Z (0x1A) 文字が来たら TSTP シグナルを生成 その他カノニカル処理 CR->LF変換、行バッファなど

5.

ssh user@host sleep 100 ssh read/write 端末ラインディシプリン 端末ドライバ TCP/IP, ソケット etc sleep 100

6.

ssh user@host sleep 100 TCP/IP, ソケット etc closed ssh sleep 100 SIGINT read/write 端末ラインディシプリン ^C 端末ドライバ Ctrl-Cを入力すると、sshプロセスに SIGINT が送信され、sshプロセスが 終了する。 Ctrl-C →sleep 100は生き残る

7.

ssh –t user@host sleep 100 ssh TCP/IP, ソケット etc 疑似端末マスタ 疑似端末スレーブ read/write 端末ラインディシプリン 端末ドライバ 端末ラインディシプリン read/write sleep 100

8.

ssh –t user@host sleep 100 TCP/IP, ソケット etc ssh 疑似端末マスタ ^C 疑似端末スレーブ read/write ^C ^C 端末ラインディシプリン 端末ラインディシプリン read/write SIGINT 端末ドライバ ^C文字がリモートまで 伝わり、リモートで SIGINTが発生 Ctrl-C →sleep 100は終了する sleep 100

9.

ssh –t user@host sleep 100 TCP/IP, ソケット etc ssh 疑似端末マスタ ^C 疑似端末スレーブ read/write ^C 端末ラインディシプリン 端末ドライバ ^C 端末ラインディシプリン OpenSSH の sshtty.c : 84 read/write tio.c_lflag &=SIGINT ~(ISIG | ICANON...); 端末を raw モードに変更し、 sleep 100 ^C を受信してもシグナルを ^C文字がリモートまで 生成しないようにしている。 伝わり、リモートで SIGINTが発生 Ctrl-C →sleep 100は終了する

10.

まとめ    ssh user@host sleep 100  host 上で端末を持たない sleep プロセスが起動  Ctrl-C でローカルの端末ドライバが SIGINT 生成 ssh –t user@host sleep 100  host 上で疑似端末を持つ sleep プロセスが起動  Ctrl-C で host の疑似端末ドライバが SIGINT を生成 ssh user@host  コマンド無指定時はデフォルトで –t  ssh –T user@host でログイン後 Ctrl-C してみよう! 詳しくはこちらにまとめてあります http://wiki.dev.cybozu.co.jp/display/~kota-uchida/Linux+signals