2012-02-29 16 views
9

¿Hay alguna forma de establecer argv[0] en un programa Haskell (por ejemplo, uno compilado con ghc)?Configuración de argv [0] en Haskell?

Encontré las funciones getProgName y withProgName en System.Environment, pero no parece cambiar lo que informa 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

No existe una manera confiable y portátil de cambiar los informes 'ps', por lo que no me sorprendería si GHC no lo admite. –

Respuesta

16

No existe una forma portátil de hacerlo, pero en Linux 2.6.9 y hasta el nombre del proceso se puede cambiar con prctl() usando la operación PR_SET_NAME, así que solo necesitamos un poco de FFI para usarlo de Haskell. (Por lo general, es una buena idea comprobar si hay enlaces en Hackage, pero en este caso no pude encontrar ninguno).

{-# 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 

Esto parece funcionar bien para cambiar el nombre, como se ve por ps. Sin embargo, el valor devuelto por getProgName parece estar en caché cuando se inicia el programa, por lo que deberá combinarlo con withProgName para ver el cambio dentro de su programa.

+0

Esto parece cambiar solo el nombre en la salida de 'ps -A', 'ps -a' 'ps -d', 'ps -e' y tal vez otros, mientras que 'ps a', 'ps -ef', 'ps f' y probablemente otros todavía muestren los argumentos originales de la línea de comando. – thomie

+0

Boleto de GHC: https://ghc.haskell.org/trac/ghc/ticket/9143 – thomie

4

El nombre del programa se fija en el momento se inicia el programa, por lo que cualquier mecanismo para cambiar el nombre del programa será informado específica del SO. Por lo que yo sé, no hay forma de hacer esto con las bibliotecas estándar, y una búsqueda rápida de Hackage no muestra nada. No estoy seguro de que haya alguna manera de lograr esto con Linux en primer lugar, aparte de volver a ejecutar el mismo programa con un argv[0] diferente.

Cuestiones relacionadas