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

Unix 如何创建用于读取输出和写入输入的伪tty,unix,stdout,stdin,tty,Unix,Stdout,Stdin,Tty,我使用fork()和execvp()生成一个进程,该进程必须相信它已连接到交互终端,才能正常工作 生成后,我希望捕获流程的所有输出,并能够向流程发送输入 我想psuedo ttys可能会在这里有所帮助。有没有人有一个关于如何做到这一点的片段?有一个名为“expect”的软件包,您应该使用它。它使用一种称为tcl(发音为tickle)的脚本语言 您想调用forkpty()。从手册页: #包括/*用于openpty和forkpty*/ pid_t forkpty(int*amaster,char*n

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

生成后,我希望捕获流程的所有输出,并能够向流程发送输入

我想psuedo ttys可能会在这里有所帮助。有没有人有一个关于如何做到这一点的片段?

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

您想调用forkpty()。从手册页:

#包括/*用于openpty和forkpty*/

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

链接到-lutil

forkpty()函数将openpty()、fork()和login_tty()组合到 创建一个在伪终端中运行的新进程。文件描述 在amaster中返回伪终端主端的tor, 以及名称中的从属文件名(如果不为NULL)。termp和 winp参数(如果不为NULL)将确定终端属性 以及伪终端的从属侧的窗口大小


您的父进程通过读取和写入forkpty存储在“amaster”中的文件描述符与子进程进行通信,这称为主伪终端设备。孩子只需与连接到从伪终端设备的stdin和stdout对话。

已经提到通过Tcl使用,但它也可以在没有Tcl的情况下使用,方法是将其视为一个C库并调用API

,这确实就是伪tty的用途。我经常希望Windows具有类似的内置功能。虽然expect网站看起来很业余,但expect已经存在多年,因此它是一个可靠的软件包。由于OP以“我正在使用fork()和execvp()生成进程…”开头,很明显,他们希望在现有程序中包含此功能,不要在TCL中重写它,因为expect.forkpty()在Linux和Mac上,但在Solaris或AIX上不可用。如果您想要可移植性,POSIX定义函数POSIX_openpt()、ptsname()、grantpt()和unlockpt()。是的,它是BSD标准,由Linux继承。