如何创建一个用于读取输出和写入输入的伪tty

Ben*_*ale 7 unix stdin stdout tty

我使用fork()和execvp()来生成一个进程,该进程必须相信它已连接到交互式终端才能正常运行.

一旦产生,我想捕获进程的所有输出,并且能够将输入发送到进程.

我怀疑psuedo-ttys可能会有所帮助.有没有人有关于如何做到这一点的片段?

caf*_*caf 6

你想调用forkpty().从手册页:

#include <pty.h>/*for openpty和forkpty*/

pid_t forkpty(int*amaster,char*name,struct termios*termp,struct winsize*winp);

与-lutil链接.

forkpty()函数结合了openpty(),fork()和login_tty()来创建在伪终端中运行的新进程.伪终端的主端的文件描述符在amaster中返回,如果从属的文件名不是NULL,则返回其名称.如果不是NULL,则termp和winp参数将确定伪终端的从属侧的终端属性和窗口大小.

您的父进程通过读取和写入forkpty存储在"amaster"中的文件描述符来与子进行通信 - 这称为主伪终端设备.孩子只是与stdin和stdout对话,它们连接到奴隶伪终端设备.

  • forkpty()在Linux和Mac上,但不是Solaris或AIX.如果您想要可移植性,POSIX定义函数posix_openpt(),ptsname(),grantpt()和unlockpt(). (3认同)
  • 是的,它是一个 BSD 标准,被 Linux 继承。 (2认同)

小智 1

您应该使用一个名为“expect”的包。它使用一种称为 tcl(发音为tickle)的脚本语言。

https://core.tcl-lang.org/expect/

  • 由于 OP 开头是“我正在使用 fork() 和 execvp() 生成一个进程...”,很明显他们希望在现有程序中包含此功能,而不是在 TCL 中重写它。 (2认同)