在Haskell中设置argv [0]? [英] Setting argv[0] in Haskell?
问题描述
有没有办法在Haskell程序中设置 argv [0]
(比如用ghc编译的程序)?
我在System.Environment中找到了 getProgName
和 withProgName
函数,但它似乎没有改变 ps
报告(Ubuntu)。
import System.Environment
main =
do name< - getProgName
putStrLn $您好,我的名字是++名称
withProgNameother$ do
newname< ; - getProgName
putStrLn $现在名称设置为++ newname
putStrLn你叫什么名字:
- 允许时间运行ps
ans< - getLine
putStrLn $很高兴认识你,++ ans
prctl()
使用 PR_SET_NAME
操作,所以我们只需要一点点的FFI就可以在Haskell中使用它。 (检查Hackage上是否有绑定通常是个好主意,但在这种情况下我找不到任何)。 { - #LANGUAGE ForeignFunctionInterface# - }
导入Foreign.C
外部导入ccallsys / prctl.h prctl
prctl :: CInt - > CString - > CULong - > CULong - > CULong - > IO CInt
setProgName :: String - > IO()
setProgName title =
withCString title $ \title' - >
res( - )prctl pr_set_name title'0 0 0
return()
where pr_set_name = 15
对于 getProgName
返回的值似乎被缓存,因此您必须将它与 withProgName $ c $> c>查看程序中的更改。
Is there a way to set argv[0]
in a Haskell program (say, one compiled with ghc)?
I found the getProgName
and withProgName
functions in System.Environment, but it doesn't seem to change what ps
reports (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
There is no portable way of doing this, but on Linux 2.6.9 and up the process name can be changed with prctl()
using the PR_SET_NAME
operation, so we just need a little bit of FFI to use it from Haskell. (It's usually a good idea to check if there are any bindings on Hackage, but in this case I couldn't find any).
{-# 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
This seems to work fine for changing the name as seen by ps
. However, the value returned by getProgName
appears to be cached when the program starts, so you'll have to combine this with withProgName
to see the change within your program.
这篇关于在Haskell中设置argv [0]?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!