有没有办法在
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上,使用PR_SET_NAME操作可以使用
原文链接:https://www.f2er.com/ubuntu/347294.htmlprctl()
更改进程名称,所以我们只需要一点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返回的值似乎被缓存,因此您必须将它与-progName组合以查看程序中的更改.