lectura stdin sin buffering

Mi aplicación de prueba es

#include  #include  #include  #include  #include  #include  #include  #include  int main(int argc, char *argv[], char *envp[]) { int fd[2]; if(pipe(fd)  0) write(fd[1], c, 1); } return 0; } 

Quiero ver el código de carácter después de cada carácter introducido. Pero, de hecho, * s se imprime solo después de ‘\ n’ en la consola. Así que parece que stdin (archivo con desc 0) está en búfer. Pero la función de lectura no tiene búfer, ¿no es así? Donde me equivoco

UPD: yo uso linux

Así que la solución es

 #include  #include  #include  #include  int main(int argc, char *argv[], char *envp[]) { int fd[2]; if(pipe(fd)  0) write(fd[1], c, 1); } return 0; } 

Desafortunadamente, el comportamiento que está buscando no es posible con ANSI C estándar, y el modo predeterminado para la entrada / salida del terminal UNIX está orientado a la línea, lo que significa que siempre necesitará un carácter \n ingresado para recuperar la entrada. Tendrá que usar las instalaciones de terminal de E / S que le permiten progtwigr en modo no canónico , de modo que cada pulsación de tecla active un evento. En Linux / UNIX, puede buscar en el o en la biblioteca ncurses .

Me parece que tu solución es un poco complicada. Todavía no entiendo por qué necesitas tubería y 2 procesos.

 #include  #include  #include  #include  int main(int argc, char *argv[], char *envp[]) { struct termios term, term_orig; if(tcgetattr(0, &term_orig)) { printf("tcgetattr failed\n"); exit(-1); } term = term_orig; term.c_lflag &= ~ICANON; term.c_lflag |= ECHO; term.c_cc[VMIN] = 0; term.c_cc[VTIME] = 0; if (tcsetattr(0, TCSANOW, &term)) { printf("tcsetattr failed\n"); exit(-1); } char ch; while (1) { if (read(0, &ch, 1) > 0) printf(" %d\n", ch); } return 0; } 

Unix almacena sus caracteres tty dentro del kernel en parte para que los progtwigs no tengan que manejar individualmente la edición de líneas a menos que lo deseen.

Puede indicar al controlador tty que le dé los bytes inmediatamente. Hay varias bibliotecas que hacen esto un poco más fácil que usar el ioctl en bruto. Puedes comenzar con termios(3) .