Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Mencipta Program Yang Meniru Terminal (TTY) pada Linux dan macOS?
Buat Program Menyamar sebagai TTY
Dalam banyak senario, program meneliti sifat stdin, membezakan sama ada ia terminal (TTY) atau paip menggunakan fungsi khusus seperti isatty. Perbezaan ini mendorong program untuk menjana output secara berbeza. Untuk menangani cabaran ini, kami akan meneroka cara membina program yang mampu menyamar sebagai TTY.
Penyelesaian untuk Linux dan macOS
Coretan kod di bawah menunjukkan contoh penyelesaian yang berdaya maju untuk kedua-dua Linux dan macOS. Ia memanfaatkan antara muka pty, menawarkan kefungsian untuk menjalankan perintah dalam terminal pseudo, dengan berkesan memperdaya atur cara untuk mentafsir input sebagai bersumberkan TTY:
#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); // Forkpty setup: master (parent) and child (command execution) if (child == -1) { perror("failed to fork pty"); return EX_OSERR; } if (child == 0) { execvp(argv[1], argv + 1); // Execute the specified command within the pty } signal(SIGHUP, sighandler); signal(SIGINT, sighandler); signal(SIGTERM, sighandler); // Trap signals and forward them to the child const int buf_size = 1024; char buf[buf_size]; fd_set fds; ssize_t bytes_read; // I/O management variables while (1) { FD_ZERO(&fds); FD_SET(master, &fds); // Set up file descriptor set and monitor master (pty) 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; } } } }
Kod ini mewujudkan saluran komunikasi antara proses induk dan proses kanak-kanak berjalan dalam pty. Proses induk membaca secara berterusan daripada pty dan memajukan kandungannya kepada stdout, dengan berkesan mensimulasikan gelagat TTY biasa.
Melaksanakan pendekatan ini membolehkan program anda memintas potensi kekangan yang dikenakan oleh program yang mengharapkan input daripada TTY. Ia memperkasakan program anda untuk memanipulasi dan mengubah input sambil mengekalkan samaran terminal.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencipta Program Yang Meniru Terminal (TTY) pada Linux dan macOS?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!