Haskell default io buffering
Ayer escribí un pequeño ejercicio xinetd para mis alumnos: hacer un programa de eco inverso.
Para aprender algo nuevo, traté de implementar una solución de Haskell. Lo trivialmain = forever $ interact reverse
No funciona. Fui a travesesta pregunta e hizo una versión corregida:
import Control.Monad
import System.IO
main = forever $ interact revLines
revLines = unlines . map (reverse) . lines
Pero esta versión corregida tampoco funciona. yo leo eldocumentación de almacenamiento en búfer y jugó con los distintos ajustes. Si me pongoNoBuffering
oLineBuffering
, mi programa funciona correctamente. Finalmente, imprimí los modos de almacenamiento en búfer predeterminados para stdin y stdout
import System.IO
main = do
hGetBuffering stdin >>= print
hGetBuffering stdout >>= print
TengoBlockBuffering Nothing
si ejecuto mi programa desde xinetd (echo "test" | nc localhost 7
) pero de cli tengoLineBuffering
Editar: Gracias a todos por las respuestas útiles.
Acepto la respuesta que me dio el incendio, él me dio una pista con isatty (3). Revisé nuevamente la documentación de System.IO y encontré elsu dispositivo Función, con la que puedo comprobar la conexión del mango.
Para el registro, aquí está mi programa final:
{-# OPTIONS_GHC -W #-}
import System.IO
main = do
hSetBuffering stdin LineBuffering
hSetBuffering stdout LineBuffering
interact revLines
revLines = unlines . map (reverse) . lines