有没有办法在Haskell程序中设置argv[0]
(例如,用ghc编译的程序)?
我在System.Environment中找到了getProgName
和withProgName
函数,但似乎没有更改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
答案 0 :(得分:16)
没有可移植的方法,但在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
结合使用才能看到程序中的更改。
答案 1 :(得分:4)
程序名称在程序启动时是固定的,因此任何更改报告的程序名称的机制都将是特定于操作系统的。据我所知,标准库没有办法做到这一点,快速搜索Hackage并没有显示任何内容。我不确定除了用不同的argv[0]
重新执行相同的程序之外,还有什么方法可以用Linux实现这一点。