2012-02-29 27 views
9

Có cách nào để đặt argv[0] trong chương trình Haskell (ví dụ, một được biên dịch bằng ghc) không?Cài đặt argv [0] trong Haskell?

Tôi đã tìm thấy các chức năng getProgNamewithProgName trong System.Environment, nhưng dường như không thay đổi báo cáo ps (Ubuntu) nào.

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

Không có cách nào đáng tin cậy và di động để thay đổi các báo cáo 'ps', vì vậy tôi sẽ không ngạc nhiên nếu GHC không hỗ trợ điều này. –

Trả lời

16

Không có cách nào di động để làm điều này, nhưng trên Linux 2.6.9 và lên tên quá trình có thể được thay đổi với prctl() bằng cách sử dụng hoạt động PR_SET_NAME, vì vậy chúng tôi chỉ cần một chút FFI để sử dụng nó từ Haskell. (Nó thường là một ý tưởng tốt để kiểm tra nếu có bất kỳ ràng buộc trên Hackage, nhưng trong trường hợp này tôi không thể tìm thấy bất kỳ).

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

Điều này có vẻ phù hợp để thay đổi tên như được thấy bởi ps. Tuy nhiên, giá trị trả về bởi getProgName dường như được lưu vào bộ nhớ cache khi chương trình bắt đầu, vì vậy bạn sẽ phải kết hợp điều này với withProgName để xem thay đổi trong chương trình của bạn.

+0

Điều này dường như chỉ thay đổi tên trong đầu ra của 'ps -A', 'ps -a' 'ps -d', 'ps -e' và có thể là những cái khác, trong khi 'ps a', 'ps -ef', 'ps f' và có lẽ những người khác vẫn hiển thị các đối số dòng lệnh gốc. – thomie

+0

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

4

Tên chương trình được cố định tại thời điểm chương trình bắt đầu, vì vậy bất kỳ cơ chế nào để thay đổi tên chương trình được báo cáo sẽ là hệ điều hành cụ thể. Theo tôi biết, không có cách nào để làm điều này với các thư viện chuẩn, và tìm kiếm nhanh chóng của Hackage không hiển thị bất cứ điều gì. Tôi không chắc chắn có bất kỳ cách nào để thực hiện điều này với Linux ở nơi đầu tiên, khác hơn là tái thực hiện chương trình tương tự với một khác nhau argv[0].

Các vấn đề liên quan