module Detach (detach) where import Control.Concurrent import Control.Monad import System.Posix.IO import System.Posix.Process (createSession, forkProcess) detach :: IO () -> IO Bool detach :: IO () -> IO Bool detach IO () daemon = do IO ProcessID -> IO () forall (f :: * -> *) a. Functor f => f a -> f () void (IO ProcessID -> IO ()) -> IO ProcessID -> IO () forall a b. (a -> b) -> a -> b $ IO () -> IO ProcessID forkProcess (IO () -> IO ProcessID) -> IO () -> IO ProcessID forall a b. (a -> b) -> a -> b $ do Fd devnull <- FilePath -> OpenMode -> Maybe FileMode -> OpenFileFlags -> IO Fd openFd FilePath "/dev/null" OpenMode ReadWrite Maybe FileMode forall a. Maybe a Nothing OpenFileFlags defaultFileFlags IO Fd -> IO () forall (f :: * -> *) a. Functor f => f a -> f () void (IO Fd -> IO ()) -> IO Fd -> IO () forall a b. (a -> b) -> a -> b $ Fd -> Fd -> IO Fd dupTo Fd devnull Fd stdInput IO Fd -> IO () forall (f :: * -> *) a. Functor f => f a -> f () void (IO Fd -> IO ()) -> IO Fd -> IO () forall a b. (a -> b) -> a -> b $ Fd -> Fd -> IO Fd dupTo Fd devnull Fd stdOutput IO Fd -> IO () forall (f :: * -> *) a. Functor f => f a -> f () void (IO Fd -> IO ()) -> IO Fd -> IO () forall a b. (a -> b) -> a -> b $ Fd -> Fd -> IO Fd dupTo Fd devnull Fd stdError Fd -> IO () closeFd Fd devnull IO ProcessID -> IO () forall (f :: * -> *) a. Functor f => f a -> f () void IO ProcessID createSession IO ProcessID -> IO () forall (f :: * -> *) a. Functor f => f a -> f () void (IO ProcessID -> IO ()) -> IO ProcessID -> IO () forall a b. (a -> b) -> a -> b $ IO () -> IO ProcessID forkProcess IO () daemon Int -> IO () threadDelay (Int 10Int -> Int -> Int forall a b. (Num a, Integral b) => a -> b -> a ^(Int 6::Int)) Bool -> IO Bool forall (m :: * -> *) a. Monad m => a -> m a return Bool True