Eri*_*ikR 9 ubuntu haskell ps argv
有没有办法argv[0]
在Haskell程序中设置(比如用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
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
才能查看程序中的更改.