Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Membuat Program Fikir Ia Berjalan di Terminal?

Bagaimana untuk Membuat Program Fikir Ia Berjalan di Terminal?

Barbara Streisand
Barbara Streisandasal
2024-11-29 12:44:09144semak imbas

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

Cara Mencontohi TTY untuk Program

Apabila program berinteraksi dengan stdin, ia mungkin berkelakuan berbeza berdasarkan sama ada ia adalah terminal atau paip. Untuk mengatasinya, anda boleh menggunakan teknik yang dipanggil emulasi "pseudoterminal" (Pty) untuk menjadikan program anda kelihatan sebagai TTY.

Satu pelaksanaan disediakan dalam kod C di bawah, menggunakan fungsi forkpty. Kod ini menyediakan pseudoterminal, memotong proses anak untuk melaksanakan perintah yang diingini dan memajukan outputnya secara berterusan ke 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;
      }
    }
  }
}

Dengan menyepadukan teknik ini, atur cara anda boleh berinteraksi dengan aplikasi lain dengan berkesan seolah-olah ia beroperasi melalui terminal.

Atas ialah kandungan terperinci Bagaimana untuk Membuat Program Fikir Ia Berjalan di Terminal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn