0

我必须编写一个程序来拦截来自终端的数据,并且我必须解析它。在处理完数据后,我必须在它进入标准输出之前对其进行解析。

我不能使用tee或像prog > file 2>&1程序将是交互式的命令。

例如:如果用户ls在终端中输入我必须解析它,那么它应该进入操作系统,然后当我得到处理后的结果时,我必须在它显示在终端之前再次解析它。

我做了我的研究,我认为我可以通过伪终端接口( pty )来实现它。

请让我知道是否有更好的方法来实现它。我正在使用cppandbash平台是*nix.

更新:我也可以使用libexpectfrom expect

4

1 回答 1

2

我不确定你在这里是什么意思 - 你的意思是交互式程序“在另一个终端与用户通信”甚至显示 GUI?

它如何指定终端?这里的程序布局可能很重要(哪个程序启动哪个)。

如果您的应用程序使用 GUI 与用户通信,那么我会简单地这样做:启动 bash,将 sdtin 和 stdout 附加到管道,您的程序读取和写入这些管道的末端,解析数据,并在其上读取/写入自己的标准输入和标准输出 - 所以它出现在它的终端上。

如果您的意思是控制与您的应用程序不同的终端,那么它会得到解决,因为系统通常不期望程序在多个终端上运行。我认为不可能过滤终端和附加到它的已经工作的应用程序之间的通信。启动另一个进程产生另一个终端可能是一种选择 - 基本上让两个终端同步工作。但随后您将不得不通过其他方式(命名管道、网络连接或其他 IPC)同步这两个进程。

如果您提供有关您的程序的更多详细信息,我可能会提供更多有针对性的帮助。

PS不要告诉我你正在写一些终端键盘记录器')

编辑:

您的程序可能是基于 GUI 的 - 我会推荐类似于 banuj 链接的答案。

最好的选择可能是创建三个管道,然后分叉,并在子进程中将管道的相应端分配给标准输入、标准输出和标准错误。然后子进程应该执行到 shell - 可能是 bash,尽管我不确定如果大声读出其他 shell 是否听起来更好;)主进程将能够读/写提到的管道的其他端,将输入和输出解析为 bash和它运行的程序。您也可以直接执行用户指定的命令,但这会迫使您接管 shell 的繁琐工作——管理当前目录、环境变量、作业控制等。

然而,使用上述方法可能会导致一些麻烦 - 一些程序(通常在与安全相关的上下文中 - 例如 su(do) 要求输入密码)无论如何都会尝试绕过 stdin/stdout 并直接从终端设备读取。我不确定在这种情况下你能做什么——编写你自己的终端仿真器是一种选择,但我不知道你是否想为此深入研究系统编程。

如果你想要一些代码片段,如果你不知道上面怎么做,请问;)

于 2013-04-19T05:46:57.953 回答