Encontré una línea que sale de cat
El comando está completamente almacenado en búfer. ¿Qué significa?
¿Qué significa completamente en búfer, con búfer de línea y sin búfer en C? [closed]
hambre4ideas
Estándar C11 en línea7.21.3/3:
Cuando una corriente es sin búfer, los caracteres están destinados a aparecer desde el origen o en el destino lo antes posible. De lo contrario, los caracteres pueden acumularse y transmitirse hacia o desde el entorno anfitrión como un bloque. Cuando una corriente es totalmente almacenado en búfer, los caracteres están destinados a transmitirse hacia o desde el entorno del host como un bloque cuando se llena un búfer. Cuando una corriente es línea almacenada en búfer, los caracteres están destinados a transmitirse hacia o desde el entorno del host como un bloque cuando se encuentra un carácter de nueva línea. Además, los caracteres están destinados a transmitirse como un bloque al entorno del host cuando se llena un búfer, cuando se solicita una entrada en un flujo sin búfer o cuando se solicita una entrada en un flujo con 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 la
setbuf
ysetvbuf
funciones
7.21.3/7:
Al iniciar el programa, hay tres flujos de texto 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 la salida de diagnóstico). Tal como se abrió inicialmente, el flujo de error estándar no está totalmente almacenado en el búfer; los flujos de entrada estándar y de salida estándar se almacenan en búfer completos si y solo si se puede determinar que el flujo no hace referencia a un dispositivo interactivo.
ikegami
[I’m using Perl in the examples for conciseness and ease of reproduction, but the concepts I’m illustrating are not specific to Perl. C works in the same manner.]
El almacenamiento en búfer dicta la frecuencia con la que las cosas escritas en un identificador de archivo se descargan (envían) al sistema operativo. Compare el comportamiento de los siguientes dos comandos:
# With buffering (default)
perl -e'$|=0; print "a"; sleep(2); print "b\n";'
# Without buffering
perl -e'$|=1; print "a"; sleep(2); print "b\n";'
Normalmente, el búfer solo se vacía cuando se llena. La salida con búfer de línea también se vacía cuando se encuentra una nueva línea. Comparar:
perl -e'print "a"; sleep(2); print "b\n";'
perl -e'print "a\n"; sleep(2); print "b\n";'
La mayoría de los programas usan almacenamiento en bloque. Sin embargo, generalmente cambian al búfer de línea para la salida estándar cuando está conectado a una terminal. Comparar:
# Perl's STDOUT is line-buffered when connected to a terminal.
perl -e'print "a\n"; sleep(2); print "b\n";'
# Perl's STDOUT is fully buffered when connected to a pipe.
perl -e'print "a\n"; sleep(2); print "b\n";' | cat
# unbuffer uses pseudo-ttys to fool a program into thinking it's connected to a terminal.
unbuffer perl -e'print "a\n"; sleep(2); print "b\n";' | cat
-
En realidad, lo tienes al revés. Desde
man perlvar
:$| If set to nonzero, forces a flush right away and after every write or print on the currently selected output channel.
Así que 0 es con almacenamiento en búfer y 1 es sin él.– Pascual
26 de marzo de 2018 a las 4:29
-
@Pascall, vaya, arreglado.
– ikegami
26 de marzo de 2018 a las 4:31
-
Creo que la intención de su segundo bloque de código fue mostrar lo que sucede con el almacenamiento en búfer de línea. Dado que comienza deshabilitando el almacenamiento en búfer, no creo que muestre lo que pretendía. No he leído tu tercer bloque de código.
– Pascual
26 de marzo de 2018 a las 4:57
-
@Pascal, también arreglado.
– ikegami
26 de marzo de 2018 a las 5:50
La salida sin búfer escribe bytes desde el archivo de entrada a la salida estándar sin demora a medida que se lee cada uno.
La salida del búfer completo primero lee el archivo completo en secuencia a medida que lo lee y lo almacena en el búfer y muestra el búfer que está listo.
Con la opción -u puedes evitarlo.
Vaya a su motor de búsqueda favorito y búsquelo allí. Obtendrás miles de buenas respuestas.
– Un tipo programador
12 de abril de 2016 a las 12:26
^^ seguro, pero los otros estudiantes ya habrán plagiado todas las buenas respuestas de la primera página. Publicaciones como esta están destinadas a solicitar una respuesta única para que la entregue el OP.
– Martín James
12 de abril de 2016 a las 13:01
@MartinJames: ¿tan cínico? 😉
– KevinDTimm
12 de abril de 2016 a las 13:21