Heim >Backend-Entwicklung >Golang >Wie kann ich unter Linux und macOS ein Programm erstellen, das ein Terminal (TTY) nachahmt?

Wie kann ich unter Linux und macOS ein Programm erstellen, das ein Terminal (TTY) nachahmt?

Susan Sarandon
Susan SarandonOriginal
2024-12-01 06:41:17219Durchsuche

How Can I Create a Program That Mimics a Terminal (TTY) on Linux and macOS?

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(&amp;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(&amp;fds);
    FD_SET(master, &amp;fds);
    // Set up file descriptor set and monitor master (pty)

    if (select(master + 1, &amp;fds, NULL, NULL, NULL) > 0 &amp;&amp; FD_ISSET(master, &amp;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!

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