C 输出到多个终端

C 输出到多个终端,c,terminal,popen,C,Terminal,Popen,我正在分析一个大的日志文件。我想根据严重性分类、严重性、警告等提取特定消息。在解析日志时,我想根据消息的严重性将消息发送到给定的、衍生的、特定于严重性的终端。当主程序读取完日志文件时,终端不应关闭。环境是solaris 10/gcc 3.4.6。我发现下面的示例捕获了我的想法,但并不完全适用于xterm生成,但没有向其发送输出: #include <stdio.h> int main() { FILE *output; int i; output =

我正在分析一个大的日志文件。我想根据严重性分类、严重性、警告等提取特定消息。在解析日志时,我想根据消息的严重性将消息发送到给定的、衍生的、特定于严重性的终端。当主程序读取完日志文件时,终端不应关闭。环境是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生成的句柄和写入终端的输出是不同的,只是。。。。这似乎很容易做到。

一般来说,可以做到的是:

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参数将在应用程序退出时阻止终端关闭

管道的想法听起来很合理,但存在一些问题:

当然,您不能简单地通过管道写入新生成的终端。xterm将忽略这一点;在xterm中运行的应用程序从伪终端进行读/写操作。 无法在发送到给定终端的消息中向后滚动 终端中运行的程序无法捕获到对pty设备的建议写入 <> P>而不是发送到终端,您可能会考虑获得xLess一个简单的X应用程序,它可能已经是一个包的一部分,但是很简单,可以构建和构造您的输出函数来实现这一点:

对于每个消息类别,打开一个到xless的管道一次 写下信息 不要关上管子 这会让你的窗户无法关闭。以下是一个示例屏幕截图:

如中所述,可以在上找到来源。

谢谢大家的精彩回复,我非常感谢

好的,听起来需要稍微重新设计=我做了一个快速的原型,看起来它会工作。将输出写入单独的严重性文件,然后完成后,为每个文件弹出一个xterm,如

sprintf (Crit, "xterm <yadda yadda> -e sh -c 'cat <crit-log>; <yadda yadda>');
popen (Crit, "r");
如果中间日志文件需要在以后进行检查,而无需再次执行大型日志解析程序,那么写入中间日志文件实际上是一个额外的好处


再次感谢大家

gcc 3.4.6?认真地目前的版本是5.1。使用这样一个过时的版本有什么好的理由吗?@stefan有时候,我不得不在gcc2.95上编写代码。我想环境危害:有充分的理由吗?不可以。在这方面我无法控制我的环境。您打开的每个xterm都应该显示为一个新的/dev/pts/n设备。您只需将输出写入stdout和stderr,然后将程序输出重定向为xterm;xterm;myprogram>/dev/pts/12>/dev/pts/2。从未测试过,但应该有效。不过,您只能使用两个终端。他正在使用Solaris 10-不能假定他在该特定xterm中使用了-hold。我喜欢这个答案,但我想知道您所说的无法回滚发送到给定终端的消息是什么意思。我想你知道Shift+PgUp。事实上,我相信你会的,因为我认出了你的名字。我记得,在终端内运行的任何东西都无法访问这个……在超过savedLines限制后,它就丢失了。寻呼机应该比这更好。