프로그램의 TTY를 에뮬레이트하는 방법
프로그램이 stdin과 상호 작용할 때 터미널인지 여부에 따라 다르게 동작할 수 있습니다. 아니면 파이프. 이를 극복하기 위해 "의사 터미널"(Pty) 에뮬레이션이라는 기술을 사용하여 프로그램을 TTY로 표시할 수 있습니다.
forkpty 함수를 사용하여 아래 C 코드에 한 가지 구현이 제공됩니다. 이 코드는 의사 터미널을 설정하고, 원하는 명령을 실행하기 위해 하위 프로세스를 포크하고, 해당 출력을 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!