Establecer argv[0] en Haskell?
ubuntu ps (2)
El nombre del programa se fija en el momento en que se inicia el programa, por lo que cualquier mecanismo para cambiar el nombre del programa informado será específico del sistema operativo. Hasta donde 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 una argv[0]
diferente argv[0]
.
¿Hay alguna manera de establecer argv[0]
en un programa Haskell (por ejemplo, uno compilado con ghc)?
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
No hay 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 según lo visto por ps
. Sin embargo, el valor devuelto por getProgName
parece estar almacenado en la getProgName
caché cuando se inicia el programa, por lo que deberá combinar esto con withProgName
para ver el cambio dentro de su programa.