Установка argv [0] в Haskell? - PullRequest
       27

Установка argv [0] в Haskell?

9 голосов
/ 29 февраля 2012

Есть ли способ установить argv[0] в программе на Haskell (скажем, скомпилированной с помощью ghc)?

Я нашел функции getProgName и withProgName в System.Environment, но, похоже, он не меняет того, что сообщает 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

Ответы [ 2 ]

16 голосов
/ 29 февраля 2012

Нет переносимого способа сделать это, но в Linux 2.6.9 и выше имя процесса можно изменить с помощью prctl() с помощью операции PR_SET_NAME, поэтому нам просто нужно немного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, чтобы увидеть изменения в вашей программе.

4 голосов
/ 29 февраля 2012

Имя программы фиксируется во время ее запуска, поэтому любой механизм изменения сообщаемого имени программы будет зависеть от ОС. Насколько я знаю, это невозможно сделать со стандартными библиотеками, и быстрый поиск Hackage ничего не показывает. Я не уверен, что есть какой-то способ сделать это с помощью Linux, кроме повторного выполнения той же программы с другим argv[0].

...