Heim >Backend-Entwicklung >Golang >Wie kann ich unter Linux und macOS ein Programm erstellen, das ein Terminal (TTY) nachahmt?
Erstellen Sie ein als TTY getarntes Programm
In vielen Szenarien prüfen Programme die Natur von stdin und erkennen, ob es sich um ein Terminal (TTY) handelt. oder eine Pipe, die spezielle Funktionen wie isatty verwendet. Diese Unterscheidung veranlasst Programme, Ausgaben unterschiedlich zu generieren. Um dieser Herausforderung zu begegnen, untersuchen wir, wie man ein Programm erstellt, das sich als TTY tarnen kann.
Eine Lösung für Linux und macOS
Der folgende Codeausschnitt veranschaulicht dies eine praktikable Lösung für Linux und macOS. Es nutzt die PTY-Schnittstelle und bietet die Funktionalität, Befehle in einem Pseudo-Terminal auszuführen, wodurch Programme effektiv dazu verleitet werden, die Eingabe als von einem TTY stammend zu interpretieren:
#include <signal.h> #include <stdlib.h> #include <sysexits.h> #include <unistd.h> #include <util.h> pid_t child = 0; void sighandler(int signum) { if (child > 0) { killpg(child, signum); exit(signum); } } int main(int argc, char *argv[]) { if (argc < 2) { return EX_USAGE; } int master; child = forkpty(&master, NULL, NULL, NULL); // Forkpty setup: master (parent) and child (command execution) if (child == -1) { perror("failed to fork pty"); return EX_OSERR; } if (child == 0) { execvp(argv[1], argv + 1); // Execute the specified command within the pty } signal(SIGHUP, sighandler); signal(SIGINT, sighandler); signal(SIGTERM, sighandler); // Trap signals and forward them to the child const int buf_size = 1024; char buf[buf_size]; fd_set fds; ssize_t bytes_read; // I/O management variables while (1) { FD_ZERO(&fds); FD_SET(master, &fds); // Set up file descriptor set and monitor master (pty) if (select(master + 1, &fds, NULL, NULL, NULL) > 0 && FD_ISSET(master, &fds)) { bytes_read = read(master, buf, buf_size); if (bytes_read <= 0) { return EXIT_SUCCESS; } if (write(STDOUT_FILENO, buf, bytes_read) != bytes_read) { perror("failed to write to stdout"); return EX_OSERR; } } } }
Dieser Code stellt einen Kommunikationskanal zwischen einem übergeordneten Prozess her und ein untergeordneter Prozess, der innerhalb einer PTY ausgeführt wird. Der übergeordnete Prozess liest kontinuierlich vom pty und leitet seinen Inhalt an stdout weiter, wodurch effektiv das Verhalten eines regulären TTY simuliert wird.
Durch die Implementierung dieses Ansatzes kann Ihr Programm potenzielle Einschränkungen umgehen, die von Programmen auferlegt werden, die Eingaben von einem TTY erwarten. Es ermöglicht Ihrem Programm, Eingaben zu manipulieren und umzuwandeln, während es dennoch die Gestalt eines Terminals behält.
Das obige ist der detaillierte Inhalt vonWie kann ich unter Linux und macOS ein Programm erstellen, das ein Terminal (TTY) nachahmt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!