有没有办法设置argv[0]
在 Haskell 程序中(例如,用 ghc 编译的程序)?
我找到了getProgName
and withProgName
System.Environment 中的函数,但它似乎没有改变什么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 及更高版本上,可以使用以下命令更改进程名称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
这似乎可以很好地更改名称,如ps
。但是,返回的值getProgName
似乎在程序启动时被缓存,因此您必须将其与withProgName
查看程序中的更改。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)