from - read stdin c
Entradas en búfer y no en búfer en C (3)
Puede asociar un búfer con un archivo, incluyendo stdin
, con setvbuf()
. Puede cambiar el modo de almacenamiento en búfer a completo, línea o ninguno.
¿Hay alguna forma de averiguar si la input
está en buffered
o no en unbuffered
(aparte de las páginas de manual)? ¿No podemos descifrar mirando los nombres de las funciones? También para echoing
y no nonechoing...
Para una referencia rápida, ¿dónde encontrar la lista que contiene los detalles de las entradas de nonechoing
, no en nonechoing
, de echoing
y de no nonechoing
?
Todas las funciones de stdio.h
para leer desde un FILE
pueden mostrar un comportamiento "almacenado" o "sin almacenamiento", y un comportamiento "hacer eco" o "no hacer eco". Lo que controla estas cosas no es qué función utiliza, sino la configuración de la secuencia y / o su descriptor de archivo subyacente.
La función de biblioteca estándar
setvbuf
se puede usar para habilitar o inhabilitar el almacenamiento en búfer de entrada (y salida) por parte de la biblioteca C. Esto no tiene ningún efecto en el almacenamiento en búfer por el sistema operativo. Hay tres modos posibles: "totalmente almacenado en búfer" (leer o escribir en partes sustanciales); "line buffered" (búfer hasta que se lee o escribe un carácter''/n''
, pero no más allá de eso); y "sin búfer" (todas las lecturas y escrituras van al sistema operativo inmediatamente).El almacenamiento en búfer predeterminado para los nuevos objetos de
FILE
(incluidosstdin
y amigos) está definido por la implementación. Las bibliotecas de Unixy C generalmente predeterminan todos losFILE
a búferes completos, con dos excepciones.stderr
defecto está en búfer. Para cualquier otroFILE
, sisetvbuf
no se ha usado en él en el momento de la primera lectura o escritura real, eisatty
es cierto para el descriptor de archivo subyacente, entonces elFILE
convierte en búfer de línea.Algunas bibliotecas de C proporcionan funciones de extensión, por ejemplo,
__flbf
y amigos en Linux y Solaris, para leer algunas de las configuraciones controladas porsetvbuf
. Tenga en cuenta que, como se describió anteriormente, el modo de almacenamiento en búfer puede cambiar en la primera lectura o escritura real, si no se ha establecido explícitamente.
Si la entrada proviene de un archivo, setvbuf
es el único botón que tiene. Si la entrada proviene de algún tipo de canal de comunicación, puede haber otros mandos:
En los sistemas que cumplen con POSIX (lea "todo excepto Windows"), un programa puede solicitar cualquiera de varios modos diferentes para entrada de terminal. De estos, la distinción más importante que se debe hacer es entre "canónico" y "no canónico" . Un terminal en modo canónico exhibe tanto el búfer como el eco. (Este almacenamiento en búfer es independiente del almacenamiento en búfer que puede hacer la biblioteca C si
setvbuf
no se ha utilizado para deshabilitarlo). El modo no canónico le permite alternar el almacenamiento en búfer y el eco por separado. La interfaz del terminal POSIX de bajo nivel es extensa, complicada y le permite leer y escribir todas estas configuraciones.Si crees que quieres poner el terminal en un modo no canónico, antes de escribir un montón de código en la API POSIX de bajo nivel para hacerlo, primero debes considerar si la biblioteca
readline
oncurses
te hará la vida más fácil.Si estás leyendo desde una pipa, estás a merced de quien le escriba; no puedes controlar el tamaño de los trozos que obtienes.
Si está leyendo desde un socket, es posible que pueda ejercer cierto control sobre el tamaño de los trozos que obtiene mediante el uso cuidadoso de
recvmsg
, pero no hay garantías.No sé cómo está en Windows.
Norma de lenguaje ISO / IEC 9899-1999 C99
5.1.2.3 Ejecución del programa
...
5) La dinámica de entrada y salida de los dispositivos interactivos se llevará a cabo como se especifica en 7.19.3. La intención de estos requisitos es que la salida sin búfer o con búfer de línea aparezca lo antes posible, para garantizar que los mensajes de solicitud aparezcan antes de que un programa espere la entrada. ...
7.19.3 Archivos
...
3) Cuando un flujo no tiene buffer, se pretende que los caracteres aparezcan desde la fuente o en el destino tan pronto como sea posible. De lo contrario, los caracteres pueden acumularse y transmitirse hacia o desde el entorno del host como un bloque. Cuando un flujo está completamente almacenado en búfer, se pretende que los caracteres se transmitan hacia o desde el entorno del host como un bloque cuando se llena un búfer. Cuando un flujo tiene un búfer de línea, se pretende que los caracteres se transmitan hacia o desde el entorno del host como un bloque cuando se encuentra un carácter de nueva línea. Además, se pretende que los caracteres se transmitan como un bloque al entorno del host cuando se llena un búfer, cuando se solicita la entrada en un flujo no almacenado en búfer, o cuando se solicita la entrada en un flujo del búfer de línea que requiere la transmisión de caracteres desde el entorno del host . El soporte para estas características está definido por la implementación y puede verse afectado a través de las funciones setbuf y setvbuf. ...
7) Al inicio del programa, tres flujos de texto están predefinidos y no es necesario abrirlos explícitamente: entrada estándar (para leer entrada convencional), salida estándar (para escribir salida convencional) y error estándar (para escribir salida de diagnóstico). Como se abrió inicialmente, el flujo de error estándar no está completamente almacenado en búfer; la entrada estándar y las secuencias de salida estándar están completamente almacenadas en búfer si, y solo si se puede determinar que la secuencia no se refiere a un dispositivo interactivo.