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