2012-02-29 19 views
9

Haskell programında argv[0]'u ayarlamanın bir yolu var mı (biri ghc ile derlenmiş)?Haskell'de argv [0] ayarlanıyor mu?

System.Environment'ta getProgName ve withProgName işlevlerini buldum, ancak ps raporlarını (Ubuntu) değiştirmiyor gibi görünüyor.

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

'ps' raporlarını değiştirmenin güvenilir ve taşınabilir bir yolu yoktur, bu yüzden GHC bunu desteklemezse şaşırmam. –

cevap

16

Bunu yapmanın taşınabilir bir yolu yoktur, ancak Linux 2.6.9 ve üstü işlem isimleriişlemi kullanılarak prctl() ile değiştirilebilir, bu yüzden sadece Haskell'den kullanmak için biraz FFI'ye ihtiyacımız var. (Hackage'de herhangi bir bağlantı olup olmadığını kontrol etmek genellikle iyi bir fikirdir, ancak bu durumda hiçbir şey bulamadım).

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

Bu ps tarafından görülen adını değiştirmek için çok iyi çalışıyor görünüyor. Ancak, program başlatıldığında getProgName tarafından döndürülen değer önbelleğe alınmış gibi görünüyor, bu nedenle programınızdaki değişikliği görmek için bunu withProgName ile birleştirmeniz gerekecek.

+0

Bu sadece 'ps -A', 'ps -a' 'ps -d', 'ps -e' ve belki başkalarının çıktısında ismini değiştirirken, 'ps a', 'ps -ef', 'ps f' ve muhtemelen diğerleri hala orijinal komut satırı argümanlarını gösterir. – thomie

+0

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

4

program adı program başlamadan anda sabittir, bu nedenle herhangi bir mekanizma bildirilen program adı OS özgü olacaktır değiştirmek için. Bildiğim kadarıyla, standart kütüphanelerle bunu yapmanın bir yolu yok ve Hackage'un hızlı bir araması hiçbir şey göstermiyor. Aynı programı farklı bir argv[0] ile tekrar yürütmekten başka, Linux ile bunu başarmanın bir yolu olmadığından emin değilim.