7

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

一旦产生,我想捕获进程的所有输出,以及能够将输入发送到进程。

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

4

3 回答 3

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() 来创建一个在伪终端中运行的新进程。伪终端主机端的文件描述符在 amaster 中返回,如果它不为 NULL,则在 name 中返回从机的文件名。termp 和 winp 参数,如果不为 NULL,将决定伪终端从端的终端属性和窗口大小。

您的父进程通过读取和写入 forkpty 存储在“amaster”中的文件描述符来与子进程对话 - 这称为主伪终端设备。孩子只是与连接到从伪终端设备的标准输入和标准输出对话。

于 2009-07-29T23:43:43.900 回答
1

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

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

于 2009-07-29T23:39:11.477 回答
1

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

于 2009-07-30T13:15:51.543 回答