Maison > développement back-end > Golang > Comment faire croire à un programme qu'il s'exécute dans un terminal ?

Comment faire croire à un programme qu'il s'exécute dans un terminal ?

Barbara Streisand
Libérer: 2024-11-29 12:44:09
original
129 Les gens l'ont consulté

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

Comment émuler un TTY pour un programme

Lorsqu'un programme interagit avec stdin, il peut se comporter différemment selon qu'il s'agit ou non d'un terminal ou un tuyau. Pour surmonter ce problème, vous pouvez utiliser une technique appelée émulation de « pseudoterminal » (Pty) pour faire apparaître votre programme comme un TTY.

Une implémentation est fournie dans le code C ci-dessous, en utilisant la fonction forkpty. Ce code configure un pseudoterminal, crée un processus enfant pour exécuter la commande souhaitée et transmet en permanence sa sortie à la sortie standard.

#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;
      }
    }
  }
}
Copier après la connexion

En intégrant cette technique, votre programme peut interagir efficacement avec d'autres applications comme s'il fonctionnaient via un terminal.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal