The Select interface provides a Haskell wrapper for the select()
OS call supplied by many modern UNIX variants. Select exports the
following:
type TimeOut = Maybe Int
-- Nothing => wait indefinitely.
-- Just x | x >= 0 => block waiting for 'x' micro seconds.
-- | otherwise => block waiting for '-x' micro seconds.
hSelect :: [Handle]
-> [Handle]
-> [Handle]
-> TimeOut
-> IO SelectResult
type SelectResult
= ( [Handle] -- input handles ready
, [Handle] -- output handles ready
, [Handle] -- exc. handles ready
) |
Here's an example of how it could be used:
module Main(main) where
import Select
import IO
main :: IO ()
main = do
hSetBuffering stdin NoBuffering
putStrLn "waiting for input to appear"
hSelect [stdin] [] [] Nothing
putStrLn "input ready, let's try reading"
x <- getChar
print x |
where the call to hSelect makes the process go to sleep
until there's input available on stdin.
In brief: don't. For two reasons:
hSelect will cause all your Haskell
threads to block until the hSelect returns,
much like any call to a foreign function.
You don't need to. Concurrent Haskell will let you do
I/O on multiple file handles concurrently by forking threads,
and if you need to assign a timeout, then this can be done
using a combination of threadDelay (see
) and asynchronous exceptions
(see ).