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!