2014-10-14 9 views
5

Weź np. execve (2), które zgodnie z POSIX ma ten prototyp [1]:Dlaczego argumenty argv i envp nie wyświetlają wskaźników na const?

int execve(const char *path, char *const argv[], char *const envp[]); 

Dla mnie wydaje się, że

int execve(const char *path, const char *const argv[], const char *const envp[]); 

byłaby oczywista poprawa.

Czy ktoś wie, dlaczego tak jest? Co może wyjaśnić potrzebę manipulowania danymi ciągami argv/envp?

[1] http://pubs.opengroup.org/onlinepubs/009695399/functions/exec.html

+0

[W odpowiedzi na twoje komentarze na temat usuniętej odpowiedzi] Och, rozumiem, co masz na myśli - tak, moja odpowiedź odnosi się do argumentów "głównego", a nie do argumentów "argv". To naprawdę jest pytanie C API, a nie pytanie o system Unix. Myślę, że odpowiedź jest po prostu historyczna kompatybilność z oryginalnymi, pre-const API. – Gilles

+2

Ponieważ pytania dotyczące interfejsu API C (w przeciwieństwie do ogólnego projektu systemu) nie są tutaj tematem, głosuję za migracją do [tak]. (Nie odświeżaj, pytanie wkrótce zostanie przeniesione.) – Gilles

+0

Prawdopodobnie niektóre programy mutują te bufory. –

Odpowiedz

-1

Niektóre programy manipulować ciągi argv tak że ps wyjście pokazać trochę informacji publicznej. Na przykład:

root  6550 10809 0 13:10 ?  00:00:00 pure-ftpd (IDLE) 
root  32216  1 0 Apr05 ?  00:00:00 vtund[s]: waiting for connections on port 5000 
1023  30448 9847 0 09:01 ?  00:00:01 imap [username 192.168.1.135] 

Dlatego wartości argv nie są stałe i nie powinny być zadeklarowane jako takie.

+1

Prawdopodobnie jednak programy te modyfikują kopię ciągów argv w ich * własnej * przestrzeni adresowej, a nie w przestrzeni adresowej procesu, który nazywał się 'execve'. –