9

argv[0]Haskell プログラム (たとえば、ghc でコンパイルされたもの)に設定する方法はありますか?

getProgNameSystem.Environment でand関数を見つけましたが、レポート (Ubuntu) はwithProgName変更されていないようです。ps

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
4

2 に答える 2

16

これを行う移植可能な方法はありませんが、Linux 2.6.9 以降ではprctl()、操作を使用してプロセス名を変更できる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

于 2012-02-29T17:49:01.557 に答える
4

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

于 2012-02-29T17:14:51.407 に答える