在Haskell中设置argv ?

有没有办法在Haskell程序中设置argv[0] (比如用ghc编译的)?

我在System.Environment中find了getProgNamewithProgName函数,但似乎没有改变ps报告(Ubuntu)。

 import System.Environment main = do name <- getProgName putStrLn $ "Hello, my name is " ++ name withProgName "other" $ do newname <- getProgName putStrLn $ "Name now set to " ++ newname putStrLn "What is your name: " -- allow time to run ps ans <- getLine putStrLn $ "Pleased to meet you, " ++ ans 

这样做没有可移植的方法,但是在Linux 2.6.9以上,进程名可以使用PR_SET_NAME操作通过prctl()更改,所以我们只需要一点点的FFI就可以使用Haskell。 (通常检查Hackage上是否有绑定是个好主意,但在这种情况下我找不到任何东西)。

 {-# LANGUAGE ForeignFunctionInterface #-} import Foreign.C foreign import ccall "sys/prctl.h prctl" prctl :: CInt -> CString -> CULong -> CULong -> CULong -> IO CInt setProgName :: String -> IO () setProgName title = withCString title $ \title' -> do res <- prctl pr_set_name title' 0 0 0 return () where pr_set_name = 15 

这似乎工作正常改变名称由ps看到。 但是,程序启动时, getProgName返回的值似乎被缓存,因此您必须将其与withProgName结合使用withProgName在程序中查看更改。

程序名称在程序启动时是固定的,因此任何更改报告程序名称的机制都是特定于操作系统的。 据我所知,没有办法用标准库来做到这一点,快速搜索Hackage并没有显示任何东西。 我不确定有什么办法可以用Linux来完成,除了用不同的argv[0]重新执行相同的程序。