在Haskell中设置argv [0]?

时间:2012-02-29 16:46:54

标签: haskell ubuntu argv ps

有没有办法在Haskell程序中设置argv[0](例如,用ghc编译的程序)?

我在System.Environment中找到了getProgNamewithProgName函数,但似乎没有更改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

2 个答案:

答案 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实现这一点。