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

¿Cuál es la diferencia entre un servicio xinetd tcp y un programa cli, en relación con el almacenamiento en búfer?¿Tengo que configurar manualmente el búfer si quiero escribir un programa que funcione con ambos métodos de ejecución?

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 

Respuestas a la pregunta(2)

Su respuesta a la pregunta