2013-10-21 18 views
13

Tôi tự hỏi nếu có một lý do giữa hai hàm exec khác nhau trong const -ness, nếu đây chỉ là lỗi trong Unix đơn:Tại sao `execvp` lại lấy một` char * const argv [] `?

Trích xuất từ ​​trang manpage của Linux, có vẻ phù hợp với Single Unix Specification, đây là một hai phiên bản của exec:

int execlp(const char *file, const char *arg, ...);
int execvp(const char *
file, char *constargv[]);

execlp mất đối số của nó như const char *, và phải mất hai hoặc nhiều trong số họ. const trong C là lời hứa rằng chức năng sẽ không thay đổi dữ liệu được trỏ tới, trong trường hợp này là các ký tự thực tế (char) tạo nên chuỗi.

execvp thay vì nhận các đối số của nó dưới dạng một chuỗi con trỏ. Tuy nhiên, thay vì một mảng con trỏ đến const char * như bạn mong đợi, từ khóa const ở một vị trí khác — và điều này khá quan trọng đối với C. execvp đang nói rằng nó cũng có thể sửa đổi các ký tự trong chuỗi, nhưng nó hứa hẹn không sửa đổi mảng - tức là các con trỏ tới các chuỗi. Vì vậy, nói cách khác,

int fake_execvp(const char *file, char *const argv[]) { 
    argv[0] = "some other string"; /* this is an error */ 
    argv[0][0] = 'f';    /* change first letter to 'f': this is perfectly OK! */ 
    /* ⋮ */ 
} 

Đặc biệt, điều này làm cho nó khó khăn (về mặt kỹ thuật, cấm) để gọi execvp sử dụng 'std::string s' s to_cstr() phương pháp C++, trong đó trả const char *.

Có vẻ như execvp thực sự phải mất const char *const argv[], nói cách khác, nó phải hứa sẽ không thực hiện một trong các thay đổi ở trên.

+2

Tại sao nó được di chuyển nếu nó đã có câu trả lời được chấp nhận ?? – haccks

+0

Vì nó thuộc về đây. – Wug

Trả lời

9

Để trích dẫn trang web bạn liên kết:

Tuyên bố về argv[]envp[] là hằng số được bao gồm để làm cho rõ ràng để nhà văn tương lai của bindings ngôn ngữ mà những đối tượng là hoàn toàn không thay đổi. Do hạn chế của tiêu chuẩn ISO C , không thể nêu rõ ý tưởng đó theo tiêu chuẩn C. Chỉ định hai mức const - đủ điều kiện cho các tham số argv[]envp[] cho các chức năng exec có vẻ là tự nhiên lựa chọn , do các hàm này không sửa đổi hoặc là các mảng của các con trỏ hoặc các ký tự mà hàm này trỏ đến, nhưng điều này sẽ không cho phép mã chính xác hiện tại.

Về cơ bản các const trình độ chuyên môn trên execlpexecvp là hoàn toàn tương thích theo nghĩa là họ xác định những hạn chế giống hệt nhau trên các đối số tương ứng.

+0

* (Chỉnh sửa: Bỏ qua điều này. Điểm của tôi đã được thảo luận trực tiếp đã có trong [câu hỏi này] (http://stackoverflow.com/questions/3496000/why-is-it-not-ok-to-pass-char-to -a-function-that-take-a-const-char-in? rq = 1)). * Bảng gần cuối trang được liên kết đó [1] (http://pubs.opengroup.org/onlinepubs /9699919799/functions/fexecve.html) rất đáng ngạc nhiên đối với tôi. Tôi đã không nhận ra trong C đó là không thể khởi tạo một 'const char * const *' với một 'char * const *'. Điều này làm việc tốt trong C + +. Tôi không thể hiểu tại sao. Tại sao C coi hai loại này không tương thích? –

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