在Haskell中设置argv [0]?

Eri*_*ikR 9 ubuntu haskell ps argv

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

我在System.Environment中找到了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
Run Code Online (Sandbox Code Playgroud)

ham*_*mar 16

没有可移植的方法,但在Linux 2.6.9及更高版本上,可以prctl()使用PR_SET_NAME操作更改进程名称,因此我们只需要一点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
Run Code Online (Sandbox Code Playgroud)

这似乎可以正常改变名称ps.但是,返回的值getProgName似乎在程序启动时被缓存,因此您必须将其与此结合withProgName才能查看程序中的更改.