
Hi all, I've got a but it code below thats not quite working as I expect it to. The basic idea is that it opens a master/slave pair of pseudo terminals, forks a child process and then perform bi-directional communication between the parent and the child via the master/slave psuedo terminal. The thing does really need to forkProcess because once the comms is working I want to exec another process in the child. I also intend to dup the file descriptors so that stdin, stdout and stderr all point to the slave's end of the pty. The code below *almost* works. Its currently printing out: parent : Forked child was here! parent : Message from parent. Read 21 bytes while I think it should print: parent : Forked child was here! parent : Read 21 bytes Any clues on why 'Message from parent.' is also ending up on stdout? This is ghc-6.12.1 on Debian Linux. Cheers, Erik import System.Posix.IO import System.Posix.Process import System.Posix.Terminal import System.Posix.Types main :: IO () main = do (master, slave) <- openPseudoTerminal _childId <- forkProcess $ forkedChild (master, slave) closeFd slave runParent master runParent :: Fd -> IO () runParent fd = do (str, _) <- fdRead fd 1024 putStr $ "parent : " ++ str _ <- fdWrite fd "Message from parent.\n" (str2, _) <- fdRead fd 1024 putStr $ "parent : " ++ str2 forkedChild :: (Fd, Fd) -> IO () forkedChild (master, fd) = do closeFd master _ <- fdWrite fd "Forked child was here!\n" (_, count) <- fdRead fd 1024 _ <- fdWrite fd $ "Read " ++ show count ++ " bytes\n" closeFd fd -- ---------------------------------------------------------------------- Erik de Castro Lopo http://www.mega-nerd.com/