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(&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(&fds); FD_SET(master, &fds); 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; } } } }
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!