435 Views
March 07, 15
スライド概要
僕らがCtrl-Cを入力すると、誰がINTシグナルを作るのだろうか。
サイボウズ・ラボ株式会社で教育向けのOSやCPU、コンパイラなどの研究開発をしています。
Hacking Ctrl-C @uchan_nos 2015/03/06
Ctrl-C アプリを止めるのに使う SIGINT を発生させる _人人人人人人人人人人人人_ > 誰がSIGINTを作るのか <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
端末とプロセス 端末ドライバ プロセス /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
端末ラインディシプリン ユーザプロセス(bashなど) read/write関数 端末ラインディシプリン 端末装置ドライバ Ctrl-C (0x03) 文字が来たら INT シグナルを生成 Ctrl-Z (0x1A) 文字が来たら TSTP シグナルを生成 その他カノニカル処理 CR->LF変換、行バッファなど
ssh user@host sleep 100 ssh read/write 端末ラインディシプリン 端末ドライバ TCP/IP, ソケット etc sleep 100
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は生き残る
ssh –t user@host sleep 100 ssh TCP/IP, ソケット etc 疑似端末マスタ 疑似端末スレーブ read/write 端末ラインディシプリン 端末ドライバ 端末ラインディシプリン read/write sleep 100
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
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は終了する
まとめ 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