gpt4 book ai didi

haskell - 在 Haskell 中设置 argv[0]?

转载 作者:太空宇宙 更新时间:2023-11-03 16:44:25 25 4
gpt4 key购买 nike

有没有办法在 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 结合使用才能查看程序中的更改。

关于haskell - 在 Haskell 中设置 argv[0]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9503157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com