Heim >Backend-Entwicklung >Golang >Wie kann ich mein Programm unter Linux und macOS so gestalten, als wäre es ein TTY?

Wie kann ich mein Programm unter Linux und macOS so gestalten, als wäre es ein TTY?

Linda Hamilton
Linda HamiltonOriginal
2024-12-14 06:11:11721Durchsuche

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

Vorgeben, ein TTY zu sein: Ein tieferer Einblick

Eine der häufigsten Herausforderungen beim Programmieren ist der Umgang mit Programmen, die Eingabequellen diskriminieren (wie stdin) basierend darauf, ob es sich um ein Terminal (TTY) oder eine Pipe handelt. Um dieses Problem zu beheben, muss Ihr Programm möglicherweise so tun, als wäre es ein TTY. In diesem Artikel werden wir untersuchen, wie dies sowohl unter Linux als auch unter macOS mit eigenständigen Binärprogrammen erreicht werden kann, wobei wir uns hauptsächlich auf Go konzentrieren.

Die Schlüsselidee hinter dem Vorgeben, ein TTY zu sein, besteht darin, ein Pseudo-Terminal zu erstellen (auch bekannt als PTY). Ein PTY ist ein virtuelles Terminal, das sich wie ein normales Terminal verhält, tatsächlich jedoch als Paar von Dateideskriptoren implementiert ist. Einer dieser Dateideskriptoren wird zum Lesen von Eingaben aus dem PTY verwendet, während der andere zum Schreiben von Ausgaben verwendet wird.

Der folgende Go-Code bietet ein Beispiel dafür, wie ein PTY erstellt und darin ein Befehl ausgeführt wird und erfasst seine Ausgabe:

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()
}

Dieser Code kann mit dem folgenden Befehl in eine eigenständige Binärdatei kompiliert werden:

go build -o ttypretend main.go

Einmal kompiliert, können Sie das Programm wie folgt ausführen:

./ttypretend

Und es gibt den Inhalt des aktuellen Verzeichnisses aus.

Das obige ist der detaillierte Inhalt vonWie kann ich mein Programm unter Linux und macOS so gestalten, als wäre es ein TTY?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn