【问题标题】:Outputting to multiple terminals输出到多个终端
【发布时间】:2015-05-21 19:58:40
【问题描述】:

我正在解析一个大型日志文件。我想根据严重性分类(严重、警告等)提取特定消息。在解析日志时,我想根据消息的严重性将消息发送到给定的、衍生的、特定于严重性的终端。当主程序完成读取日志文件时,终端不应关闭。环境是solaris 10/gcc 3.4.6。我找到了以下示例,该示例捕获了我的想法,但效果不佳(xterm 产生,但没有向其发送输出):

#include <stdio.h>

int main()
{
    FILE *output;
    int   i;

    output = popen ("xterm", "w");

    for (i = 0; i < 10; i++)
       fprintf (output, "%d\n", i);

    pclose (output);
}

我没有与 xterm 结婚,我只是把它用作方便,我喜欢它的标题、颜色和大小的能力。我有点明白,写入由 popen 生成的句柄与写入终端的输出不同(只是有点......)。这似乎是一件容易的事。

【问题讨论】:

  • gcc 3.4.6?严重地?当前版本是 5.1。使用这种过时的版本有充分的理由吗?
  • @stefan 有时,我必须在 gcc 2.95 上编写代码。 “环境危害”我想:)
  • 有充分的理由吗?不。在这方面我无法控制我的环境。
  • 您打开的每个 xterm 都应该显示为一个新的 /dev/pts/n 设备。您可以简单地将您的输出写入标准输出和标准错误,然后将您的程序输出重定向为xterm; xterm; myprogram &gt;/dev/pts/1 2&gt;/dev/pts/2。从未测试过,但应该可以工作。不过,您只能使用两个终端。

标签: c terminal popen


【解决方案1】:

总的来说,可以做的是:

1) adjust your application so it can accept a parameter that indicates what level of severity to output to stdout.
2) open three terminals from the keyboard
3) run your application in each terminal, giving each execution the appropriate command line parameter

如果您要从您的应用程序中打开终端,对于“xterm”等,--hold 参数将在您的应用程序退出时阻止终端关闭

【讨论】:

  • 他正在使用 Solaris 10 - 不能假设他在那个特定的 xterm 中有 -hold
【解决方案2】:

管道的想法听起来很合理,但有几个问题:

  • 当然,您不能简单地通过管道写入新生成的终端。 xterm 将忽略它;它是在 xterm 中运行的应用程序,它从伪终端读取/写入。
  • 无法回滚发送到给定终端的消息
  • 终端中运行的程序无法捕获对 pty 设备的建议写入

您可以考虑获取xless(一个简单的 X 应用程序,它可能已经是包的一部分,但构建起来很简单),而不是发送到终端,并构造您的输出函数来执行此操作:

p>
  • 对于每个消息类别,打开一个到xless 的管道一次
  • 写消息
  • 不要关闭管道

这会给你不会关闭的窗口。这是一个示例屏幕截图:

来源可以在ftp.x.org 上找到,如Debian package description 中所述。

【讨论】:

  • 我喜欢这个答案,但我想知道您所说的“无法回滚发送到给定终端的消息”是什么意思。我假设你知道 Shift+PgUp。 (其实我相信你会这样做,因为我认出了你的名字)
  • 我想到了这样一个事实,即终端内运行的任何东西都无法访问它......并且在超过 savedLines 限制后,它就丢失了。寻呼机预计会做得更好。
【解决方案3】:

感谢大家的伟大回复,我非常感谢他们!

好的,听起来需要进行轻微的重新设计 =) 我做了一个快速原型,看起来它可以工作。将输出写入单独的严重性文件,然后在完成后为每个文件弹出一个 xterm,类似于

sprintf (Crit, "xterm <yadda yadda> -e sh -c 'cat <crit-log>; <yadda yadda>');
popen (Crit, "r");

写入中间日志文件实际上是一种奖励,如果它们需要在以后进行审查,而不必再次通过大型日志解析程序。

再次感谢大家!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 2020-02-24
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 2017-06-15
    • 2023-03-07
    相关资源
    最近更新 更多