Maison >développement back-end >Golang >Comment puis-je faire en sorte que mon programme se fasse passer pour un ATS sous Linux et macOS ?
Faire semblant d'être un ATS : une plongée plus approfondie
L'un des défis courants rencontrés en programmation est de gérer des programmes qui discriminent les sources d'entrée (comme stdin) selon qu'il s'agit d'un terminal (TTY) ou d'un tube. Pour résoudre ce problème, vous devrez peut-être faire en sorte que votre programme se fasse passer pour un ATS. Dans cet article, nous explorerons comment y parvenir sous Linux et macOS à l'aide de programmes binaires autonomes, en nous concentrant principalement sur Go.
L'idée clé derrière le fait de se faire passer pour un TTY est de créer un pseudo-terminal (également connu sous le nom de PTY). Un pty est un terminal virtuel qui agit comme un terminal ordinaire, mais il est en réalité implémenté sous la forme d'une paire de descripteurs de fichiers. L'un de ces descripteurs de fichier est utilisé pour lire les entrées du pty, tandis que l'autre est utilisé pour y écrire la sortie.
Le code Go suivant fournit un exemple de la façon de créer un pty et d'exécuter une commande à l'intérieur. , capturant sa sortie :
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() }
Ce code peut être compilé en un binaire autonome à l'aide de la commande suivante :
go build -o ttypretend main.go
Une fois compilé, vous pouvez exécutez le programme comme suit :
./ttypretend
Et il affichera le contenu du répertoire actuel.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!