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.
Tại sao nó được di chuyển nếu nó đã có câu trả lời được chấp nhận ?? – haccks
Vì nó thuộc về đây. – Wug