【问题标题】:How to create a pseudo-tty for reading output and writing to input如何创建用于读取输出和写入输入的伪 tty
【发布时间】:2009-07-29 23:32:25
【问题描述】:

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

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

我怀疑 psuedo-ttys 在这里可能会有所帮助。有没有人知道如何做到这一点?

【问题讨论】:

  • 这确实是伪 tty 的用途。我经常希望 Windows 内置类似的功能。

标签: unix stdout stdin tty


【解决方案1】:

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

#include /* 用于 openpty 和 forkpty */

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

与 -lutil 链接。

forkpty() 函数结合了 openpty()、fork() 和 login_tty() 来 创建一个在伪终端中运行的新进程。文件描述- 伪终端主机端的tor在amaster中返回, 如果不为 NULL,则为 name 中从站的文件名。期限和 winp参数,如果不为NULL,将决定终端属性 和伪终端从端的窗口大小。

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

【讨论】:

  • forkpty() 在 Linux 和 Mac 上,但不是例如Solaris 或 AIX。如果你想要可移植性,POSIX 定义了函数 posix_openpt()、ptsname()、grantpt() 和 unlockpt()。
  • 是的,它是一个 BSD 标准,由 Linux 继承。
【解决方案2】:

Expect 已经提到通过 Tcl 使用,但它也可以在没有 Tcl 的情况下使用,将其视为 C 库并调用 API documented here

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 虽然expect网站看起来很业余,但是expect已经存在很多年了,所以它是一个可靠的包。
    • 由于 OP 以“我正在使用 fork() 和 execvp() 生成进程...”开头,因此很明显他们希望将此功能包含在现有程序中,而不是重写它在 TCL 中期待。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2015-08-07
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多