> 백엔드 개발 > Golang > 프로그램이 터미널에서 실행되고 있다고 생각하게 만드는 방법은 무엇입니까?

프로그램이 터미널에서 실행되고 있다고 생각하게 만드는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-11-29 12:44:09
원래의
142명이 탐색했습니다.

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

프로그램의 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(&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;
      }
    }
  }
}
로그인 후 복사

이 기술을 통합하면 프로그램이 다른 애플리케이션과 효과적으로 상호 작용할 수 있습니다. 단말기를 통해 운영되고 있었습니다.

위 내용은 프로그램이 터미널에서 실행되고 있다고 생각하게 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿