A biblioteca ncurses fornece uma interface de usuário interativa. No entanto, eu queria saber o que aconteceria se você canalizar algo para o programa. Então eu tentei assim:
# echo foo | my_curses_prog
Parece que sempre há entrada pendente em stdin, mas getch
não pode ler nada. Então, o que está acontecendo sob o capô?
Programa de teste atualizado:
#include <ncurses.h>
int main()
{
WINDOW *win = initscr();
nodelay(win, 0);
refresh();
FILE *fp = fopen("my_curses_prog.log", "w");
while (1) {
int ch = getch();
fprintf(fp, "%d\n", ch);
fflush(fp);
}
fclose(fp);
endwin();
return 0;
}
aplicativos curses podem ser inicializados usando
initscr
ounewterm
. O primeiro lê apenas stdin ; o último pode ser instruído a usar uma entrada diferente. Se você quiser ter um aplicativo curses lendo de um pipe, você usarianewterm
( dialog faz isso).curses espera que sua entrada seja um terminal . Um pipe nunca vai agir como um terminal, uma vez que é armazenado em buffer, não pode ser alterado para o modo bruto usando as chamadas de E/S do terminal padrão . Como sua entrada é buffered , você não vê muita coisa útil acontecendo
getch
até que seja capaz de ler todo o buffer (muitos caracteres ou até uma nova linha, dependendo de como você está testando).