有没有一种方法可以在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

最佳答案

没有可移植的方法,但是在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结合使用才能查看程序中的更改。

10-07 17:15