Ncurses и Linux конвейер

Я хотел бы написать простую программу, использующую ncurses для отображения некоторых данных. Затем я хотел бы, чтобы программа писала в стандартный вывод таким образом, чтобы я мог затем использовать конвейер (|) в командной строке для передачи некоторых данных.

Моя текущая попытка не работает. Я могу увидеть "ПОЛУЧЕНО ЗДЕСЬ" в файле, используя ">", но есть целый ряд других вещей. Программа также выходит немедленно.

#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

Можно ли использовать stdout через конвейер и ncurses одновременно?

2 ответа

Решение

По умолчанию, curses записывает в стандартный вывод, куда идет ваш канал. Но есть две разные функции инициализации для curses: initscr а также newterm, Последний позволяет вам делать то, что просили, вот так:

#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;
}

Дальнейшее чтение: страница руководства для newterm а также initscr,

Сейчас ему 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. Я не уверен, насколько она портативна или есть какие-то другие ловушки, просто рад найти решение, которое сработало.

Другие вопросы по тегам