9

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

我在 System.Environment 中找到了getProgNameandwithProgName函数,但它似乎并没有改变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
4

2 回答 2

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

这似乎适用于更改所看到的名称ps。但是,返回的值getProgName似乎在程序启动时被缓存,因此您必须将其与程序结合起来withProgName才能看到程序中的更改。

于 2012-02-29T17:49:01.557 回答
4

程序名称在程序启动时是固定的,因此任何更改报告的程序名称的机制都将是特定于操作系统的。据我所知,标准库无法做到这一点,并且快速搜索Hackage并没有显示任何内容。我不确定是否有任何方法可以首先使用 Linux 来实现这一点,除了使用不同的argv[0].

于 2012-02-29T17:14:51.407 回答