Domyślne buforowanie io Haskell
Wczoraj napisałem małe ćwiczenie xinetd dla moich uczniów: stwórz program odwrotnego echa.
Aby dowiedzieć się czegoś nowego, próbowałem zaimplementować rozwiązanie Haskell. To banalnemain = forever $ interact reverse
nie działa. Przeszedłemto pytanie i wprowadziłem poprawioną wersję:
import Control.Monad
import System.IO
main = forever $ interact revLines
revLines = unlines . map (reverse) . lines
Ale ta poprawiona wersja również nie działa. Czytambuforowanie dokumentacji i grał z różnymi ustawieniami. Jeśli ustawięNoBuffering
lubLineBuffering
, mój program działa poprawnie. Wreszcie wydrukowałem domyślne tryby buforowania dla standardowego i standardowego wyjścia
import System.IO
main = do
hGetBuffering stdin >>= print
hGetBuffering stdout >>= print
MamBlockBuffering Nothing
jeśli uruchomię program z xinetd (echo "test" | nc localhost 7
) ale od cli mamLineBuffering
Edytować: Dziękuję wszystkim za pomocne odpowiedzi.
Przyjmuję odpowiedź, która została podana przez ogień, daje mi wskazówkę z isatty (3). Przejrzałem ponownie dokumentację System.IO i znalazłemhIsTerminalDevice funkcja, dzięki której mogę sprawdzić połączenie uchwytu.
Dla porządku, oto mój ostatni program:
{-# OPTIONS_GHC -W #-}
import System.IO
main = do
hSetBuffering stdin LineBuffering
hSetBuffering stdout LineBuffering
interact revLines
revLines = unlines . map (reverse) . lines