有没有一种方法可以在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
最佳答案
没有可移植的方法,但是在Linux 2.6.9及更高版本上,可以使用prctl()
操作通过 PR_SET_NAME
更改进程名称,因此我们只需要一点FFI就可以从Haskell使用它。 (通常,最好检查一下Hackage上是否有任何绑定(bind),但是在这种情况下,我找不到任何绑定(bind))。
{-# 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
结合使用才能查看程序中的更改。