%3F.png)
Digamos que el ping
comando se está ejecutando y escribo algo en la terminal mientras ping
aún se está ejecutando.
Ahora, cuando ping
termine y bash
recupere el control, bash
imprimirá en la terminal lo que escribí mientras ping
estaba ejecutando. Esta es una captura de pantalla que muestra lo que quiero decir:
¿Cómo bash
obtuvo esta información? Estoy seguro de que no lo obtuvo de stdin
, porque cuando escribí "I typed this while ping was running"
, no presioné Enter(y por eso stdin
está vacío).
Respuesta1
Intentohizoobtenga su entrada de su entrada estándar (stdin), que es la terminal.
Un terminal puede estar en uno de dosmodos:crudoococido(también conocido como “modo de carácter” y “modo de línea”, los términos “crudo” y “cocido” se usan principalmente en el mundo Unix) (la palabra “cocido” se introdujo como un juego de palabras para hacer lo opuesto a “crudo” ). En modo sin formato, el terminal transmite la entrada inmediatamente a la aplicación. En modo preparado, el terminal lee una línea completa y proporciona un mecanismo de edición de línea (muy primitivo), y solo transmite los datos a la aplicación cuando el usuario presiona Enter.
Los terminales se inician en modo cocinado. Las aplicaciones que desean tener más control sobre la entrada, como bash, configuran el terminal en modo sin formato mientras esperan que el usuario escriba un comando.
Respuesta2
Creo que el terminal almacena en buffer cada línea de texto recibida a través del teclado, de modo que cualquier programa que tenga un descriptor de archivo (es decir, fd0) adjunto al archivo del dispositivo del terminal no verá ningún texto de la línea hasta que el terminal lo "envíe". - lo que sucede cuando presionas Enter.
(Cómo los editores de línea de shells solucionan esto; no estoy seguro, pero definitivamente acceden al texto antes de presionar Enter)
Además, cuando un shell inicia un proceso hijo (en este caso ping
), entra en un wait
estado suspendido/ing mientras se ejecuta el proceso hijo, por lo que incluso si el terminal no estuviera reteniendo texto, el shell lo ignoraría, asumiendo que así fuera. destinado al proceso hijo.
Entonces, el texto que ves aparecer en la pantalla se debe a que elTerminallo está mostrando, pero no hay ningún programa que lo capture y haga algo con él, hasta que el niño sale, y el shell "se despierta", entonces el texto se envía al editor de líneas del shell. Aunque no creo que todos los terminales necesariamente Haz eso.