haskell ubuntu argv ps

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.