
Hello, I am working on an application where I would like to chroot a thread, but I am not seeing a way to do it. I already have code which can run an IO action inside a chroot. The type signature is: fchroot :: FilePath -> IO a -> IO a The first argument is the new root, the second argument is the action to run with that root. You can see the implementation here if you are curious: http://src.seereason.com/build-env/Chroot.hs The problem with that function is that chroot affects the root of the whole process. In a single-threaded program this is (possibly) ok, because the original root is restored after the IO action completes (though with unsafeInterleaveIO, perhaps bad stuff will happen). In a multithreaded program it can be disasterous. As far as I know, the only solution would be to implement a function like fchroot which looks more like: pchroot :: FilePath -> IO () -> IO ExitCode Here the IO action would be forked off and run in a whole new process so that changing its root does not affect other 'threads'. Of course, you also can't use any of the nifty Haskell intra-thread communication stuff. Basically you can pass some values in and get back an exit code. However, I am not even sure how to implement a useful version of pchroot. In theory, I can just use forkProcess, but, the Giant Warning for forkProcess indicates that this will not be very useful in practice: forkProcess comes with a giant warning: since any other running threads are not copied into the child process, it's easy to go wrong: e.g. by accessing some shared resource that was held by another thread in the parent. Another example is the I/O manager thread: since the I/O manager isn't running in the child, attempting to do any Handle-based I/O will deadlock. Anyone have an ideas ? Thanks! - jeremy