[Haskell-cafe] Opening the same file multiple times

Donn Cave donn at drizzle.com
Mon Dec 12 01:26:48 EST 2005

Quoth Einar Karttunen <ekarttun at cs.helsinki.fi>:
| It seems that opening the same file multiple times (one writer
| and multiple readers) is not supported at least on *nix with
| GHC. I want to use one Handle to use append data till the
| end of the file while other Handles perform random access
| IO with seeks on the file.

How is it not supported?  What happens with something like this

  module Main (main) where
  import IO (openFile, IOMode(..), SeekMode(..), hPutStr, hSeek, hGetLine)
  import System (getArgs)

  main = do
        af <- openFile "z" AppendMode
        sf <- openFile "z" ReadMode
        hPutStr af "append this line\n"
        hSeek sf AbsoluteSeek 40
        hGetLine sf >>= print
        hPutStr af "append this line\n"
        hSeek sf AbsoluteSeek 60
        hGetLine sf >>= print

(It works for me, with hugs on a more or less UNIX-like platform.)

	Donn Cave, donn at drizzle.com

| Sharing the same Handle for all the threads is not possible
| since they perform seeks and may thus mess each other up.
| Hiding the Handle behind a mutex would limit concurrency
| more than I like.
| Thus I wanted to open multiple Handles to the file, but
| this seems quite hard. My best guess is to create a function 
| like:
| #ifdef mingw32_HOST_OS
| openUnlocked fn mode = openBinaryFile fn mode
| #else
| openUnlocked fn mode = withMVar mutex $ do
|   h  <- openBinaryFile fn mode
|   fd <- handleToFd h
|   unlockFile $ fromIntegral fd
|   return h
| {-# NOINLINE mutes #-}
| mutex = unsafePerformIO $ newMVar ()
| #endif
| Is there really no simpler solution?

More information about the Haskell-Cafe mailing list