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(&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; } } } }
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!