2014-10-14 23 views
5

Örnek olarak; posix göre bu prototipi [1] sahiptir execve (2),:Neden argv ve envp argümanları göstericiyi const olarak yürütür?

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

bariz gelişme olurdu sanki Bana

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

, öyle görünüyor.

Peki, kimse bunun neden böyle olduğunu biliyor mu? gereksinimini, verilen argv/envp dizgilerini muhtemelen işlemek için ne açıklayabilir? ps çıkışı bazı devlet bilgileri gösterir, böylece

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

+0

[Silinmiş cevabım hakkındaki yorumlarınıza yanıt olarak] Oh, ne demek istediğini anladım - evet, cevabım, 'argv' argümanlarını değil, 'ana' argümanlarını ele alıyor. Bu gerçekten bir C API sorusu, bir Unix sistem tasarımı sorusu değil. Cevabın, orijinal, ön yapı API'ları ile sadece tarihsel uyumluluk olduğunu düşünüyorum. – Gilles

+2

C API ile ilgili sorular (genel sistem tasarımının aksine) konu dışı olduğundan, [o] öğesine geçiş yapmaya oy veriyorum. (Yeniden gösterme, soru yakında taşınacaktır.) – Gilles

+0

Muhtemelen bazı programlar bu arabellekleri mutasyona uğratıyor –

cevap

-1

Bazı programlar argv dizeleri işlemek. Örneğin:

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] 

Dolayısıyla Argv değerleri sabit değildir ve bu şekilde beyan olmamalıdır.

+1

Muhtemelen, bu programlar, argv dizelerinin kopyasını kendi * adres alanlarında değiştirirler, işlemin 'execve' olarak adlandırılan adres alanını değil. –