2014-10-14 14 views
5

Ví dụ: execve (2), mà theo posix có nguyên mẫu này [1]:Tại sao không phải là đối số argv và envp để thực thi con trỏ đến const?

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

Đối với tôi, nó có vẻ như thể

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

sẽ là một sự cải tiến rõ ràng.

Vì vậy, có ai biết tại sao điều này giống như không? Điều gì có thể giải thích sự cần thiết để có thể thao tác các chuỗi argv/envp đã cho?

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

+0

[Trả lời nhận xét của bạn về câu trả lời đã xóa] Ồ, tôi hiểu ý bạn là gì - vâng, câu trả lời của tôi đề cập đến các đối số của 'main', không phải là đối số của' argv'. Đó thực sự là một câu hỏi C API, không phải là một câu hỏi thiết kế hệ thống Unix. Tôi nghĩ rằng câu trả lời chỉ đơn giản là tương thích lịch sử với các API ban đầu, pre-const. – Gilles

+2

Vì câu hỏi về API C (trái ngược với thiết kế hệ thống chung) không có chủ đề ở đây, tôi đang bỏ phiếu để chuyển sang [như vậy]. (Không được đăng lại, câu hỏi sẽ sớm được chuyển đi.) – Gilles

+0

Có lẽ một số chương trình biến đổi các bộ đệm này –

Trả lời

-1

Một số chương trình thao tác các chuỗi argv để ps đầu ra hiển thị một số thông tin trạng thái. Ví dụ:

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] 

Do đó giá trị argv không cố định và không được khai báo như vậy.

+1

Có lẽ, tuy nhiên, các chương trình đó sửa đổi bản sao của các chuỗi argv trong không gian địa chỉ * riêng của chúng, không phải là không gian địa chỉ của tiến trình được gọi là 'execve'. –

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