Heim > Backend-Entwicklung > Golang > Wie lässt man ein Programm glauben, dass es in einem Terminal läuft?

Wie lässt man ein Programm glauben, dass es in einem Terminal läuft?

Barbara Streisand
Freigeben: 2024-11-29 12:44:09
Original
142 Leute haben es durchsucht

How to Make a Program Think It's Running in a Terminal?

So emulieren Sie ein TTY für ein Programm

Wenn ein Programm mit stdin interagiert, verhält es sich möglicherweise anders, je nachdem, ob es sich um ein Terminal handelt oder eine Pfeife. Um dies zu umgehen, können Sie eine Technik namens „Pseudoterminal“ (Pty)-Emulation verwenden, um Ihr Programm als TTY erscheinen zu lassen.

Eine Implementierung wird im folgenden C-Code bereitgestellt, der die Funktion forkpty verwendet. Dieser Code richtet ein Pseudoterminal ein, verzweigt einen untergeordneten Prozess, um den gewünschten Befehl auszuführen, und leitet seine Ausgabe kontinuierlich an stdout weiter.

#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);

  if (child == -1) {
    perror("failed to fork pty");
    return EX_OSERR;
  }

  if (child == 0) {
    execvp(argv[1], argv + 1);
    perror("failed to execute command");
    return EX_OSERR;
  }

  signal(SIGHUP, sighandler);
  signal(SIGINT, sighandler);
  signal(SIGTERM, sighandler);

  const int buf_size = 1024;
  char buf[buf_size];
  fd_set fds;
  ssize_t bytes_read;

  while (1) {
    FD_ZERO(&amp;fds);
    FD_SET(master, &amp;fds);

    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;
      }
    }
  }
}
Nach dem Login kopieren

Durch die Integration dieser Technik kann Ihr Programm effektiv mit anderen Anwendungen interagieren, als ob es selbst wäre wurden über ein Terminal betrieben.

Das obige ist der detaillierte Inhalt vonWie lässt man ein Programm glauben, dass es in einem Terminal läuft?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage