2012-02-29 3 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がこれをサポートしていない場合は驚かないでしょう。 –

答えて

16

これはポータブルな方法ではありませんが、Linux 2.6.9以降では、プロセス名をでPR_SET_NAME操作で変更できるため、Haskellから使用するにはちょっとだけFFIが必要です。 (通常、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

+0

GHCチケット:https://ghc.haskell.org/trac/ghc/ticket/9143 – thomie

4

プログラム名はプログラム起動時に固定されているため、報告されたプログラム名を変更するメカニズムはOS固有のものです。私が知る限り、これを標準ライブラリで行う方法はなく、Hackageのクイック検索は何も表示しません。私は最初に、別のargv[0]で同じプログラムを再実行する以外に、Linuxでこれを達成する方法がないかどうかはわかりません。

関連する問題