【问题标题】:Ncurses and Linux pipelineNcurses 和 Linux 管道
【发布时间】:2011-12-03 23:26:25
【问题描述】:

我想使用 ncurses 编写一个简单的程序来显示一些数据。然后我希望程序以这样一种方式写入标准输出,然后我可以在命令行上使用管道 (|) 将一些数据输出。

我当前的尝试不起作用。我可以使用“>”在文件中看到“GOT HERE”,但还有很多其他内容。程序也会立即退出。

#include <stdio.h>
#include <ncurses.h>


int main(int _argc, char ** _argv)
{
    initscr();          /* Start curses mode          */

    printw("Hello World !!!");  /* Print Hello World          */

    refresh();          /* Print it on to the real screen */

    getch();            /* Wait for user input */

    printf("GOT HERE");

    endwin();           /* End curses mode        */

    printf("GOT HERE");

    return 0;
}

这是使用>

的最终输出
^[[?1049h^[[1;29r^[(B^[[m^[[4l^[[?7h^[[H^[[2JHello World !!!^MGOT HERE^[[29;1H^[[?1049l^M^[[?1l^[>GOT HERE

是否可以同时通过管道和 ncurses 使用stdout

【问题讨论】:

  • 这并不容易,因为ncurses默认使用stdout。所有伪图形均使用特殊符号 (^[) 完成。您可以尝试 stderr 进行文本输出:fprintf(stderr,....) in program 和 ./a.out 2&gt;file 进行重定向。
  • 你真正想做什么?一开始就在管道中拥有一个交互式程序是不寻常的。写入文件或 FIFO 并进行一些小的命令行更改要容易得多。
  • 是的。 osgx 说了什么。可能希望通过“tee”命令将他的方法与管道结合起来,以便标准输出进入屏幕以及指定的文件......这对于调试目的可能很有用。如果您使用a.out 2&gt; named_pipe(其中named_pipe 自然是命名管道),然后在不同终端使用cat named_pipe,您将能够同时看到stdout 和stderr。

标签: c stdout ncurses


【解决方案1】:

这已经 5 年了,您可能已经继续前进,但这是我搜索结果的顶部,所以我想我会添加我找到的解决方案。在尝试让管道在上面的 bash 示例等代码中工作之后,我终于找到了一个用 newterm 命令暗示正确方向的人。唯一的技巧是打开一个新的 tty 并使用 newterm 而不是 initscr:

#include  <stdio.h>
#include <ncurses.h>

int main(int argc, char ** argv) {

  FILE *f = fopen("/dev/tty", "r+");
  SCREEN *screen = newterm(NULL, f, f);
  set_term(screen);

  //this goes to stdout
  fprintf(stdout, "hello\n");
  //this goes to the console
  fprintf(stderr, "some error\n");
  //this goes to display
  mvprintw(0, 0, "hello ncurses");
  refresh();
  getch();
  endwin();

  return 0;
}

有了这个,你可以在任何你想要的地方管道 stdout 和 stderr,但有一个 ncurses 会话。我不确定它的便携性或是否有任何其他问题,很高兴找到一个可行的解决方案。

【讨论】:

  • 干得好。已经五年了(和大学教育)。我有很多学习要做。
【解决方案2】:

默认情况下,curses 会写入 标准输出,这是您的管道所在的位置。但是curses有两种不同的初始化函数:initscrnewterm。后者可以让你做被问到的事情,像这样:

#include <stdio.h>
#include <ncurses.h>


int main(int _argc, char ** _argv)
{
    newterm(NULL, stderr, stdin);          /* Start curses mode          */    
    printw("Hello World !!!");  /* Print Hello World          */    
    refresh();          /* Print it on to the real screen */    
    getch();            /* Wait for user input */    
    printf("GOT HERE");    
    endwin();           /* End curses mode        */    
    printf("GOT HERE");    
    return 0;
}

进一步阅读:newterminitscr 的手册页。

【讨论】:

    猜你喜欢
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    相关资源
    最近更新 更多