2015-01-02 11 views
5

Czy można uzyskać dostęp do oryginalnego wskaźnika argv z poziomu Haskell main?Uzyskaj dostęp do oryginalnego wskaźnika argv z Haskell

Moim przypadkiem użycia jest to, że chciałbym usunąć parametry wiersza polecenia po uruchomieniu aplikacji, aby nie można było ich odczytać przez ps. Jest na to kilka sposobów, ale wszystkie wymagają manipulowania oryginalnym argv.

jestem w stanie to zrobić, jeśli piszę C opakowanie i zadzwonić hs_init stamtąd (potem mucking z argv ala here), ale byłoby ładniej to zrobić od Haskell.

Dzięki!

PS - to pytanie różni się od duplicate, ponieważ duplikat używa numeru prctl, który, o ile wiem, pozwala tylko zmienić nazwę procesu. Co więcej, duplikat chce "ustawić" argv[0], podczas gdy ja próbuję uzyskać zmienne odniesienie do oryginalnego argv używanego do wywoływania programu.

+3

Moje początkowe przypuszczenie jest takie, że nie jest to możliwe z Haskell, ponieważ nie ma funkcji 'setArgs', a' getArgs' zwraca niezmienną listę. – bheklilr

+0

Dzięki. Przelałem kod FFI i doszedłem do tego samego wniosku, ale ponieważ jestem stosunkowo nowy, nie wiedziałem, czy istnieje inny sposób. – aaronlevin

+1

To jest coś, o czym nawet nie wiedziałem, że było to możliwe 5 minut temu, więc może być jakiś sposób, ale jeśli jest jakiś sposób, obejmie on dziwną funkcję narożną w wewnętrznej bibliotece. Zajrzyj do bibliotek specyficznych dla GHC, ponieważ prawdopodobnie zależy to od używanego kompilatora. – bheklilr

Odpowiedz

0

Spojrzałbym na moduł System.Posix.Env.ByteString(link) z pakietu unix.

Zawiera funkcje modyfikujące środowisko i mimo że zapewnia tylko getArgs, dodanie funkcji setArgs nie powinno być trudne.

+0

Ta strategia wydaje się nie działać. Wypróbuj ten kod [tutaj] (https://gist.github.com/bheklilr/ec78cc20e78479029812), który jest bardzo podobny do metody 'getArgs' w' System.Posix.Env.ByteString'. Może jest to związane z jakąś leniwą oceną? Niepewny. – aaronlevin

+0

hmmm ... nawet jeśli dodasz 'getArgs >> = print' na końcu, wydrukowane zostaną oryginalne argumenty. Zastanawiam się, dlaczego tak się dzieje. – ErikR

Powiązane problemy