2012-02-29 4 views
9

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

Я нашел функции 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 
+1

Нет надежного и портативного способа изменения отчетов 'ps', поэтому я не удивлюсь, если GHC не поддерживает это. –

ответ

16

Существует нет переносного способа сделать это, но в 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, чтобы увидеть изменение внутри вашей программы.

+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

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

Смежные вопросы