Ncurses e pipeline Linux

Mi piacerebbe scrivere un semplice programma usando ncurses per visualizzare alcuni dati. Vorrei quindi che il programma scrivesse su stdout in modo tale da poter usare una pipe (|) sulla riga di comando per eseguire il pipe di alcuni dati.

Il mio attuale tentativo non funziona. Posso vedere “GOT HERE” in un file usando ‘>’, ma c’è un sacco di altre cose. Il programma esce anche immediatamente.

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

Questo è l’output finale usando>

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

È ansible utilizzare lo stdout attraverso una pipeline e ncurses allo stesso tempo?

Di default, curses scrive sull’output standard , che è dove va la tua pipe. Ma ci sono due diverse funzioni di inizializzazione per curses: initscr e newterm . Quest’ultimo ti consente di fare ciò che è stato chiesto, in questo modo:

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

Ulteriori letture: pagina newterm per newterm e initscr .

Ora ha 5 anni e probabilmente sei andato avanti, ma questa era la parte migliore dei miei risultati di ricerca, quindi ho pensato di aggiungere la soluzione che ho trovato. Dopo un sacco di problemi con il tentativo di far funzionare le pipe in codice come l’esempio di bash qui sopra, ho finalmente trovato qualcuno che ha suggerito nella giusta direzione con il comando newterm. L’unico trucco è aprire un nuovo tty e usare newterm invece di initscr:

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

Con questo puoi redirect stdout e stderr dove vuoi, ma hai una sessione ncurses. Non sono sicuro di quanto sia portatile o se ci sono altre catture, solo felice di trovare una soluzione che ha funzionato.