2013-10-03 8 views
5

端末のサイズの変更は、sshまたはtelnetを介してコマンドラインアプリケーションにどのように送信されますか?端末のサイズの変更は、sshまたはtelnetを使用してコマンドラインアプリケーションに送信されますか?

  1. ユーザーは、sshまたはtelnetを使用してリモートマシンに接続します。

  2. VIMでドキュメントの編集を開始します。

  3. 次に、ターミナルウィンドウのサイズを変更します。

端末は、ウィンドウサイズが変更されたことをssh/telnetに通知する必要があります。これはどうやって起こるのですか?

ssh/telnetはそれ自身の特定の方法を使用して、その変更をsshd/telnetdに送信します。これらの方法は何ですか?

sshd/telnetdは、端末のサイズが変更されたことをアプリケーションに通知します。これはどうですか?それはターミナルからssh/telnetまでと同じ方法ですか?

答えて

7

これは疑似端末の乱雑な世界です。

端末のサイズを変更すると、フォアグラウンドプロセスグループがSIGWINCHになり、ioctlを使用して新しいサイズを取得できます。しかし、これはリモート vimプロセスと何が関係していますか? (

  1. posix_openpt(またはopenpty)を使用して、マスターpsedoterminalデバイス
  2. フォーク新しい子​​を開きます:

    対象は非常に複雑ですが、それの要旨は、removeサーバー(sshdが)これを行いますということです典型的には、これは、

  3. setsid()
  4. 端末装置を開きを使用して端末の接続を切断する)シェルになるように結合されている(その制御端末
  5. なるステップ1)で作成しました
  6. サーバプロセスがマスタ側に書き込むものがスレーブ側への入力として終わるこの時点で、ステップ4

からFDと標準記述子(STDIN_FILENOと友人)置き換えBUT端末回線規則とカーネルは特定の組み合わせを書くときに信号を送信するような魔法を使いますし、ioctlコールを発行しても効果があります。


これについて考える最も良い方法は、opensshスイートを調べることです。SIGWINCHため

  • クライアントモニタは - clientloop.cを参照して、サーバ指示フラグと

  • 機能client_check_window_changeチェックそれを受信したときreceived_window_change_signal = 1を設定:

    packet_start(SSH_CMSG_WINDOW_SIZE); 
    packet_put_int((u_int)ws.ws_row); 
    ... 
    

をこれで、サーバは、 (潜在的に新しい)サイズを示します。

  • サーバは本当の魔法を行い、受信したサイズでpty_change_window_sizeを呼び出します。これは、スレーブの新しいウィンドウサイズを設定します

    struct winsize w; 
    w.ws_row = row; 
    ... 
    (void) ioctl(ptyfd, TIOCSWINSZ, &w); /* This is it! */ 
    

。新しいサイズが古いものと異なる場合、カーネルは、を、そのptyに関連付けられたフォアグラウンドプロセスグループに送信します。したがって、vimもその信号を取得し、その端子サイズの考え方を更新することができます。

+0

ありがとう、本当に良い説明です。 – fadedbee

+1

@chrisdew正直言って、私は主なアイデアは知っていましたが、詳細を知らなかったので、私はそれを研究するより良い時を考えました。 – cnicutar

+0

この良い説明で何かを研究し、教える時間をとってくれてありがとう! –

関連する問題