如何模擬程式設計TTY
當程式與stdin 互動時,根據它是否是終端,它的行為可能會有所不同或管道。為了克服這個問題,您可以使用一種稱為「偽終端」(Pty) 模擬的技術,使您的程式顯示為 TTY。
下面的 C 程式碼中提供了一個實現,使用 forkpty 函數。此程式碼設定一個偽終端,分叉一個子進程來執行所需的命令,並不斷將其輸出轉發到 stdout。
#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; } } } }
透過整合此技術,您的程式可以有效地與其他應用程式交互,就好像它一樣透過終端進行操作。
以上是如何讓程式認為它正在終端機中運行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!