Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Membuat Program Saya Berpura-pura Menjadi TTY dalam Linux dan macOS?

Bagaimanakah Saya Boleh Membuat Program Saya Berpura-pura Menjadi TTY dalam Linux dan macOS?

Linda Hamilton
Linda Hamiltonasal
2024-12-14 06:11:11721semak imbas

How Can I Make My Program Pretend to Be a TTY in Linux and macOS?

Berpura-pura Menjadi TTY: A Deeper Dive

Salah satu cabaran biasa yang dihadapi dalam pengaturcaraan ialah berurusan dengan program yang mendiskriminasi sumber input (seperti stdin) berdasarkan sama ada ia adalah terminal (TTY) atau paip. Untuk menangani perkara ini, anda mungkin perlu membuat program anda berpura-pura menjadi TTY. Dalam artikel ini, kami akan meneroka cara untuk mencapai perkara ini dalam kedua-dua Linux dan macOS menggunakan program binari kendiri, memfokuskan terutamanya pada Go.

Idea utama di sebalik berpura-pura menjadi TTY adalah untuk mencipta pseudo-terminal (juga dikenali sebagai pty). Pty ialah terminal maya yang bertindak seperti terminal biasa, tetapi ia sebenarnya dilaksanakan sebagai sepasang deskriptor fail. Satu daripada deskriptor fail ini digunakan untuk membaca input daripada pty, manakala satu lagi digunakan untuk menulis output padanya.

Kod Go berikut memberikan contoh cara membuat pty dan menjalankan perintah di dalamnya , menangkap outputnya:

package main

import (
    "io"
    "log"
    "os"
    "os/exec"
    "runtime"
)

func main() {
    // Get the current operating system.
    osName := runtime.GOOS

    // Create a master pty.
    master, err := os.OpenFile("/dev/ptmx", os.O_RDWR, 0)
    if err != nil {
        log.Fatal(err)
    }

    // Get the slave pty name.
    slaveName, err := ptsname(master)
    if err != nil {
        log.Fatal(err)
    }

    // Fork a child process.
    child, err := os.ForkExec("/bin/sh", []string{"sh", "-c", "ls -la"}, nil, slaveName, master, master)
    if err != nil {
        log.Fatal(err)
    }

    // Close the master pty.
    master.Close()

    // Read output from the slave pty.
    buf := make([]byte, 1024)
    for {
        n, err := os.Read(child, buf)
        if err == io.EOF {
            break
        }
        if err != nil {
            log.Fatal(err)
        }
        if osName == "linux" {
            // Remove carriage return (CR) characters.
            buf = buf[:n-1]
        }
        os.Stdout.Write(buf)
    }

    // Wait for the child process to exit.
    child.Wait()
}

Kod ini boleh disusun menjadi binari kendiri menggunakan yang berikut arahan:

go build -o ttypretend main.go

Setelah disusun, anda boleh menjalankan program seperti berikut:

./ttypretend

Dan ia akan mengeluarkan kandungan direktori semasa.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membuat Program Saya Berpura-pura Menjadi TTY dalam Linux dan macOS?. 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