parse - haskell read file




Setzen Sie argv[0] in Haskell? (2)

Der Programmname ist beim Programmstart festgelegt, so dass jeder Mechanismus zum Ändern des gemeldeten Programmnamens betriebssystemspezifisch ist. Soweit ich weiß, gibt es keine Möglichkeit, dies mit den Standardbibliotheken zu tun, und eine schnelle Suche nach Hackage zeigt nichts an. Ich bin mir nicht sicher, ob es überhaupt einen Weg gibt, dies mit Linux zu erreichen, außer das gleiche Programm mit einem anderen argv[0] erneut auszuführen.

Gibt es eine Möglichkeit, argv[0] in einem Haskell-Programm (z. B. einem mit ghc kompilierten) zu setzen?

Ich fand die Funktionen getProgName und withProgName in System.Environment, aber es scheint nicht zu ändern, was ps berichtet (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

Es gibt keine portable Möglichkeit, dies zu tun, aber unter Linux 2.6.9 und höher kann der Prozessname mit prctl() Verwendung der Operation PR_SET_NAME werden, so dass wir nur ein wenig FFI benötigen, um es von Haskell zu verwenden. (Es ist normalerweise eine gute Idee, zu überprüfen, ob Bindages auf Hackage vorhanden sind, aber in diesem Fall konnte ich keine finden).

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

Dies scheint für die Änderung des Namens, wie er von ps gesehen wird, gut zu funktionieren. Der Wert, der von getProgName , wird jedoch beim Start des Programms zwischengespeichert. Sie müssen dies also mit " withProgName kombinieren, um die Änderung in Ihrem Programm zu sehen.





ps