Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menggunakan pseudo terminal (pty) dalam bahasa golang

Cara menggunakan pseudo terminal (pty) dalam bahasa golang

PHPz
PHPzasal
2023-04-14 09:34:521758semak imbas

Dalam sistem pengendalian moden, tetingkap terminal ialah salah satu cara paling asas interaksi manusia-komputer. Walau bagaimanapun, pemahaman kita tentang tetingkap terminal tidak seharusnya terhad kepada input dan output. Malah, tetingkap terminal harus mempunyai pelbagai fungsi seperti "bertindak balas kepada isyarat", "ubah suai saiz tetingkap", dan lain-lain, untuk memenuhi pelbagai keperluan orang ramai. Dalam sistem Linux, kami boleh menggunakan pseudo terminal (PTY) untuk melaksanakan fungsi ini, dan bahasa Golang juga menyediakan banyak API yang mudah untuk mengendalikan PTY, membolehkan kami mengawal dan berinteraksi dengan terminal dengan mudah.

1. Apakah terminal pseudo

Pertama sekali, untuk memahami terminal pseudo secara mendalam, kita mesti terlebih dahulu memahami dua fail khas di bawah sistem Linux-tty dan pty. Fail tty biasanya terletak di /dev/ttyx dan merupakan antara muka untuk pengguna berinteraksi dengan kernel Linux Contohnya, apabila anda memasukkan arahan dalam terminal, anda berinteraksi melalui antara muka tty. PTY ialah konsep logik yang mewakili terminal pseudo Ia biasanya terletak dalam /dev/ptmx dalam sistem Linux dan merupakan antara muka untuk pengguna berinteraksi dengan peranti terminal. Tujuan terminal pseudo adalah untuk mencipta tetingkap terminal maya melaluinya, membaca pemegang fail yang dicipta oleh kunci apabila pengguna memasukkan aksara, dan pada masa yang sama memajukan aliran bait daripada aplikasi ke proses kanak-kanak, dan kembalikan aliran keluaran daripada proses anak kepada pengguna.

Sebenarnya, pseudo-terminal ialah konsep simulasi (terminal simulasi Ia adalah satu set antara muka terminal yang disediakan oleh kernel Melaluinya, pengguna dan program terminal boleh melaksanakan tugas menggunakan aliran input dan output standard dan peranti terminal. Terminal pseudo akan mencipta dua deskriptor fail, satu untuk membaca dan satu untuk menulis. Satu deskriptor fail boleh digunakan untuk menulis input pengguna, dan satu lagi boleh digunakan untuk membaca data yang dikembalikan oleh program terminal Di bawah mekanisme ini, kita boleh mengawal tetingkap terminal untuk mencapai operasi yang lebih fleksibel.

2. Cara menggunakan pseudo-terminal dalam bahasa golang

Dalam bahasa golang, langkah-langkah untuk menggunakan pseudo-terminal terbahagi kepada tiga langkah:

  1. Buat pty

Dalam bahasa golang, kita boleh mencipta pty melalui fungsi StartProcess dalam perpustakaan os Fungsi ini akan mengembalikan nilai jenis *os.Process, dan nilai ini ialah pty yang boleh kita kawal . Handle, yang mengandungi aliran input dan output serta maklumat lain yang berkaitan dengan proses. Kodnya adalah seperti berikut:

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. Baca dan tulis pty

Selepas pty dicipta, kita boleh menulis dan menulis ke pty melalui kaedah Baca dan Tulis perpustakaan os Data dibaca, kodnya adalah seperti berikut:

//读取输出
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. Menunggu proses pty tamat

Akhir sekali, kita perlu menunggu sehingga proses pty untuk keluar, melalui kaedah exe.Wait().

Ringkasan

Melalui langkah di atas, kita boleh melaksanakan pty dalam bahasa golang. Secara keseluruhan, terminal pseudo ialah mekanisme sistem Linux yang sangat penting Dengan menggunakannya, kita boleh mencapai fungsi kawalan dan interaksi terminal yang sangat berkuasa. Ia membawa sedikit kerumitan, tetapi jika anda memahaminya, anda akan mempunyai peluang yang lebih baik untuk membina aplikasi interaktif tetingkap terminal yang sangat baik.

Atas ialah kandungan terperinci Cara menggunakan pseudo terminal (pty) dalam bahasa golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn