ホームページ >バックエンド開発 >Golang >Golang言語で擬似ターミナル(pty)を使う方法

Golang言語で擬似ターミナル(pty)を使う方法

PHPz
PHPzオリジナル
2023-04-14 09:34:521843ブラウズ

最新のオペレーティング システムでは、ターミナル ウィンドウは人間とコンピュータの対話の最も基本的な方法の 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 つのステップに分かれています:

  1. Create pty

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
  1. pty の読み取りと書き込み

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)
}
  1. pty プロセスの終了を待機しています

最後に、pty プロセスが終了するまで待つ必要があります。 exe.Wait() メソッドを通じて。

概要

上記の手順により、golang 言語で pty を実装できます。全体として、擬似ターミナルは非常に重要な Linux システム メカニズムであり、これを使用すると、非常に強力なターミナル制御および対話機能を実現できます。多少の複雑さは伴いますが、理解していれば、優れたターミナル ウィンドウの対話型アプリケーションを構築できる可能性が高くなります。

以上がGolang言語で擬似ターミナル(pty)を使う方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。