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