私はそのようなターミナルマルチプレクサを設計したかったのですが、それほどtmux
複雑ではなくリモートで動作できる最小のものをncurses
。
サーバー側のワークフローは次のとおりです。
- サーバープロセスは合計2つのプロセスを生成します。最初のプロセスは
fork
親プロセスからインポートされ、forkpty
2番目のプロセスは親プロセスからインポートされます。forkpty
edプロセスはbashシェルになりますexecl
。最初のプロセスは、呼び出しから返された記述子を使用して2番目のプロセスと通信しますforkpty()
。最初のプロセスもクライアントと通信します。まるでブローカーと同じです。これは、クライアントの情報をforkpty
トレーニングプロセスに渡すか、その逆も同様です。
クライアント側のワークフローは次のとおりです。
- クライアントはサーバーとの通信を担当するスレッドを生成します。内部スレッドが実行されます
ncurses
。
問題は、ncurses
bashやその他の特殊文字のエスケープシーケンスを解析しないことです。 2つのスクリーンショットを撮りました(クライアント側で撮ったものです)。最初に、サーバーから受信した情報(シェルで実行されたコマンドの出力)がwrite()
システムコールを使用して標準出力に表示されます。 2番目のスクリーンショットには、stdscr
機能の使用に関する情報が表示されますprintw
。これが2つのスクリーンショット間のコード上の唯一の違いです。
printw
端末を複数のウィンドウに分割したいので、その機能が必要です。ncurses
これらのシーケンス(および特殊文字)をどのように簡単に解釈できますか?スクリーンショットを見つけることができますここ。
tmux
PS:私はまだソースコードを完全にまたは部分的に理解するレベルではありません。