我必须编写一个拦截终端数据的程序,我必须解析它。在处理数据之后,我必须在它进入stdout之前对其进行解析。
我不能使用tee
或prog > file 2>&1
之类的命令,因为该程序将是交互式的。
例如:
如果用户在终端中键入ls
我必须解析它,那么它应该进入操作系统,然后当我在处理后得到结果时,我必须在它显示在终端之前再次解析它。
我做了我的研究,我想我可以通过伪终端接口(pty)实现它。
请告诉我是否有更好的方法来实现它。
我使用的是cpp
和bash
,平台是*nix
。
更新:
我还可以使用libexpect
中的expect
。
答案 0 :(得分:2)
我不确定你在这里是什么意思 - 你的意思是“在与用户沟通的另一个终端中工作”甚至是显示GUI的交互式程序?
如何指定终端?这里的程序布局可能很重要(程序从哪个程序开始)。
如果您的应用程序使用GUI与用户进行通信,那么我只需这样做: 用sdtin和stdout连接到管道开始bash, 你的程序是&写入它的末端是那些管道,解析数据,并在它自己的stdin& stdout上读/写 - 所以它出现在它的终端上。
如果您的意思是控制不同的终端而不是您的应用程序,那么它会受到影响,因为系统通常不希望程序在多个终端上运行。我认为不可能过滤终端与已连接的终端之间的通信。启动另一个生成另一个终端的进程可能是一个选项 - 基本上有两个终端同步工作。但是,您必须通过其他方式(命名管道,网络连接或其他一些IPC)来同步这两个进程。
如果您提供有关计划的更多详细信息,我可能会提供更多直接帮助。
PS不要告诉我你正在写一些终端键盘记录器')
修改强>
你的程序可能是基于GUI的 - 我建议的类似于banuj链接的答案。
最佳选择可能是创建三个管道,然后fork,并在子进程中将管道的相应末端分配给stdin,stdout和stderr。然后子进程应该执行shell - 可能是bash,虽然我不确定如果大声读出其他shell会听起来更好;)主进程将能够读/写所提到的管道的其他端,解析输入和输出到bash和它运行的程序。 您也可以直接执行用户指定的命令,但这会强制您接管shell的繁琐工作 - 管理当前目录,环境变量,作业控制等。
使用上述方法可能会引起一些麻烦 - 某些程序(通常在安全相关的上下文中 - 例如su(do)要求输入密码)会尝试绕过stdin / stdout并直接从终端设备读取。我不确定在这种情况下你能做什么 - 编程你自己的终端模拟器是一个选项,但我不知道你是否想深入研究系统编程。
如果你想要一些代码片段,如果你不知道如何做,请问;)