最新のオペレーティング システムでは、ターミナル ウィンドウは人間とコンピュータの対話の最も基本的な方法の 1 つです。ただし、ターミナル ウィンドウの理解は入力と出力に限定されるべきではありません。実際、ターミナル ウィンドウには、人々の多様なニーズを満たすために、「信号に応答する」「ウィンドウ サイズを変更する」などの複数の機能が必要です。 Linux システムでは、疑似ターミナル (PTY) を使用してこれらの機能を実装できます。また、Golang 言語には、PTY を操作するための便利な API が多数提供されており、ターミナルの制御と対話が容易になります。
1. 擬似ターミナルとは
まず、擬似ターミナルを深く理解するには、Linux システムの tty と pty という 2 つの特殊ファイルを理解する必要があります。 tty ファイルは通常、/dev/ttyx にあり、ユーザーが Linux カーネルと対話するためのインターフェイスです。たとえば、ターミナルにコマンドを入力するときは、tty インターフェイスを介して対話します。 PTY は擬似端末を表す論理概念で、通常 Linux システムの /dev/ptmx にあり、ユーザーが端末デバイスと対話するためのインターフェイスです。疑似ターミナルの目的は、それを通じて仮想ターミナル ウィンドウを作成し、ユーザーが文字を入力するときにロックによって作成されたファイル ハンドルを読み取り、同時にアプリケーションからのバイト ストリームを子プロセスに転送し、子プロセスからユーザーへの出力ストリーム。
実際、擬似端末はシミュレーション (シミュレートされた端末) の概念です。カーネルによって提供される一連の端末インターフェイスです。これらを通じて、ユーザーと端末プログラムは標準の入出力ストリームを使用してタスクを実行できます。および端末デバイスの相互作用。擬似端末は、読み取り用と書き込み用の 2 つのファイル記述子を作成します。一方のファイル記述子はユーザー入力の書き込みに使用され、もう一方のファイル記述子はターミナル プログラムから返されたデータの読み取りに使用され、ターミナル ウィンドウを制御してより柔軟な操作を実現します。
2. golang 言語での擬似ターミナルの使用方法
golang 言語で擬似ターミナルを使用する手順は 3 つのステップに分かれています:
Golang 言語では、OS ライブラリの StartProcess 関数を使用して pty を作成できます。この関数は *os.Process 型の値を返し、この値が制御できる pty です. 入力ストリームと出力ストリーム、およびプロセスに関連するその他の情報を含むハンドル。コードは次のとおりです。
import ( "os" "os/exec" "syscall" ) cmd := "sh" exe := exec.Command(cmd) // 设置ptmx为console exe.SysProcAttr = &syscall.SysProcAttr{Setctty: true, Setsid: true} // 打开ptmx ptmx, err := os.OpenFile("/dev/ptmx", os.O_RDWR, 0) // 解锁ptmx tmp := make([]byte, 0) if _, err := ptmx.Read(tmp); err != nil { panic(err) } // 给pty配置大小 ws := &Winsize{Width: 80, Height: 40, Xpixel: 0, Ypixel: 0} if err := IoctlSetWinsize(int(ptmx.Fd()), uintptr(unsafe.Pointer(ws))); err != nil { panic(err) } // 创建子进程pty exe.Stdout = ptmx //配置pty的输入输出流 exe.Stdin = ptmx exe.Stderr = ptmx if err := exe.Start(); err != nil { panic(err) } pid := exe.Process.Pid
pty が作成された後、OS の Read および Write メソッドを通じて pty への書き込みと読み取りを行うことができます。ライブラリ データはそこにあり、コードは次のとおりです:
//读取输出 buf := make([]byte, 1024) n, err := ptmx.Read(buf) if err != nil { panic(err) } fmt.Println(string(buf[:n])) //写入输入 if _, err := ptmx.Write([]byte("ls -al\n")); err != nil { panic(err) }
最後に、pty プロセスが終了するまで待つ必要があります。 exe.Wait() メソッドを通じて。
概要
上記の手順により、golang 言語で pty を実装できます。全体として、擬似ターミナルは非常に重要な Linux システム メカニズムであり、これを使用すると、非常に強力なターミナル制御および対話機能を実現できます。多少の複雑さは伴いますが、理解していれば、優れたターミナル ウィンドウの対話型アプリケーションを構築できる可能性が高くなります。
以上がGolang言語で擬似ターミナル(pty)を使う方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。