2015-01-02 12 views
5

Có thể truy cập con trỏ argv gốc từ bên trong Haskell main không?Truy cập con trỏ argv gốc từ Haskell

Trường hợp sử dụng của tôi là tôi muốn xóa thông số dòng lệnh sau khi ứng dụng đã bắt đầu để không thể đọc được thông qua ps. Có một số cách để làm điều này nhưng tất cả đều yêu cầu thao tác argv gốc.

Tôi có thể làm điều này nếu tôi viết trình bao bọc C và gọi hs_init từ đó (sau đó nhét xung quanh với argv ala here), nhưng tốt hơn là làm điều này từ Haskell.

Cảm ơn!

PS - câu hỏi này khác với duplicate khi bản sao sử dụng prctl, theo như tôi có thể biết, chỉ cho phép bạn thay đổi tên quy trình. Hơn nữa, bản sao đang tìm kiếm để "đặt" argv[0] trong khi tôi đang cố gắng để có được một tài liệu tham khảo có thể thay đổi để argv ban đầu được sử dụng để gọi chương trình.

+3

Dự đoán ban đầu của tôi là không thể từ Haskell vì không có hàm 'setArgs' và' getArgs' trả về một danh sách bất biến. – bheklilr

+0

Cảm ơn. Tôi đã rót mã FFI và đi đến kết luận tương tự, nhưng vì tôi khá mới mẻ với điều này nên tôi không biết liệu có cách nào khác hay không. – aaronlevin

+1

Đây là điều tôi thậm chí không biết là có thể 5 phút trước, vì vậy có thể có một cách, nhưng nếu có một cách nó sẽ liên quan đến một số chức năng góc lạ trong một thư viện nội bộ. Tìm trong các thư viện cụ thể của GHC, vì nó có thể phụ thuộc vào trình biên dịch bạn đang sử dụng. – bheklilr

Trả lời

0

Tôi sẽ xem mô-đun System.Posix.Env.ByteString(link) từ gói unix.

Nó chứa các chức năng để sửa đổi môi trường và mặc dù nó chỉ cung cấp getArgs không khó để thêm hàm setArgs.

+0

Chiến lược này dường như không hoạt động. Hãy thử mã này [ở đây] (https://gist.github.com/bheklilr/ec78cc20e78479029812), rất giống với phương thức 'getArgs' trong' System.Posix.Env.ByteString'. Có lẽ điều này liên quan đến một số đánh giá lười biếng? Không chắc. – aaronlevin

+0

hmmm ... ngay cả khi bạn thêm 'getArgs >> = print' vào cuối bản gốc được in. tự hỏi tại sao điều đó lại xảy ra. – ErikR

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