2012-02-29 85 views
9

有沒有辦法在一個Haskell程序中設置argv[0](比如用ghc編譯的)?在Haskell中設置argv [0]?

我在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 
+1

沒有可靠的,便攜的方式來改變'ps'報告,所以如果GHC不支持這一點,我不會感到驚訝。 – 2012-02-29 16:51:59

回答

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結合使用才能看到程序中的更改。

+0

這似乎只改變'ps -A','ps -a''ps -d','ps -e'和其他人的輸出中的名稱,而'ps a','ps -ef' 'ps f',可能其他人仍然顯示原始的命令行參數。 – thomie 2014-11-16 19:57:21

+0

GHC門票:https://ghc.haskell.org/trac/ghc/ticket/9143 – thomie 2014-11-16 20:10:11

4

程序名稱是固定在程序啓動的時候,所以任何機制來改變報告的程序名稱將是操作系統相關的。據我所知,沒有辦法用標準庫來做到這一點,並且Hackage的快速搜索沒有顯示任何內容。我不確定有什麼辦法可以用Linux來完成,除了用不同的argv[0]重新執行同一個程序。