我正在使用fork()和execvp()来生成一个进程,该进程必须认为它已连接到交互式终端才能正常运行。
一旦产生,我想捕获流程的所有输出,并且能够将输入发送到流程。
我怀疑psuedo-ttys可能对此有所帮助。有没有人有关于如何做到这一点的片段?
答案 0 :(得分:6)
你想调用forkpty()。从手册页:
#include< pty.h> / *表示openpty和forkpty * /
pid_t forkpty(int * amaster,char * name,struct termios * termp,struct winsize * winp);
与-lutil链接。
forkpty()函数将openpty(),fork()和login_tty()组合在一起 创建一个在伪终端中运行的新进程。文件描述 - 伪终端主机的tor在amaster中返回, 如果它不是NULL,则为名称中的slave的文件名。特朗普和 winp参数,如果不是NULL,将确定终端属性 和伪终端从属端的窗口大小。
您的父进程通过读取和写入forkpty存储在“amaster”中的文件描述符来与子进行通信 - 这称为主伪终端设备。孩子只是与stdin和stdout对话,它们连接到奴隶伪终端设备。
答案 1 :(得分:1)
你应该使用一个名为“expect”的软件包。它使用一种名为tcl(发音为tickle)的脚本语言。
答案 2 :(得分:1)
Expect已被提及通过Tcl使用,但它也可以在没有Tcl的情况下使用,将其视为C库并调用API documented here