2012-02-29 12 views
9

C'è un modo per impostare argv[0] in un programma Haskell (ad esempio, uno compilato con ghc)?Impostazione argv [0] in Haskell?

Ho trovato le funzioni getProgName e withProgName in System.Environment, ma non sembra modificare i report 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

Non esiste un modo affidabile e portabile per modificare i rapporti 'ps', quindi non sarei sorpreso se GHC non lo supporta. –

risposta

16

Non c'è un modo portatile per farlo, ma su Linux 2.6.9 e il nome del processo può essere modificato con prctl() usando l'operazione PR_SET_NAME, quindi abbiamo solo bisogno di un po 'di FFI per usarlo da Haskell. (Di solito è una buona idea controllare se ci sono legami su Hackage, ma in questo caso non sono riuscito a trovarne nessuno).

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

Questo sembra funzionare bene per la modifica del nome, come visto da ps. Tuttavia, il valore restituito da getProgName sembra essere memorizzato nella cache all'avvio del programma, quindi dovrai combinarlo con withProgName per visualizzare la modifica all'interno del programma.

+0

Questo sembra cambiare solo il nome nell'output di 'ps -A', 'ps -a' 'ps -d', 'ps -e' e forse altri, mentre 'ps a', 'ps -ef', 'ps f' e probabilmente altri mostrano ancora gli argomenti della riga di comando originale. – thomie

+0

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

4

Il nome del programma è fissato al momento il programma si avvia, in modo che qualsiasi meccanismo per cambiare il nome del programma riportato sarà specifico sistema operativo. Per quanto ne so, non c'è modo di farlo con le librerie standard, e una ricerca rapida di Hackage non mostra nulla. Non sono sicuro che in primo luogo ci sia un modo per farlo con Linux, oltre a rieseguire lo stesso programma con un diverso argv[0].