Tôi cần thực hiện lệnh unix với các arg khác nhau trong một vòng lặp. Bây giờ tôi tự hỏi nếu tôi nên sử dụng execvp(), đi qua trong cmd và args, hoặc sử dụng hệ thống, xây dựng một chuỗi bao gồm cmd + args?Khi nào nên sử dụng hệ thống() và khi nào nên sử dụng execv *()?
Trả lời
Vâng, các câu trả lời khác là chủ yếu là chính xác.
Hệ thống, trong khi không chỉ fork
s và sau đó exec
s, nó không phải exec
quy trình của bạn, nó chạy vỏ mặc định, chuyển chương trình của bạn làm đối số.
Vì vậy, trừ khi bạn thực sự muốn có một vỏ (đối với phân tích tham số và các loại tương tự) nó là nhiều hiệu quả hơn để làm điều gì đó như:
int i = fork();
if (i != 0) {
exec*(...); // whichever flavor fits the bill
} else {
wait(); // or something more sophisticated
}
Dòng chức năng exec
sẽ thay thế quy trình hiện tại bằng quy trình mới, trong khi system
sẽ bỏ qua quy trình mới và sau đó đợi hoàn tất. Mà một trong những sử dụng phụ thuộc vào những gì bạn muốn.
Vì bạn đang làm điều này trong một vòng lặp, tôi đoán bạn không muốn thay thế quy trình gốc. Do đó, tôi khuyên bạn nên thử đi với system
.
Tôi chỉ sử dụng execvp nếu tôi không thể đạt được những gì tôi muốn với hệ thống. Lưu ý rằng để có được tương đương với hệ thống, bạn cần execvp, ngã ba và xử lý tín hiệu một số là tốt.
hệ thống cũng đồng thời đưa dòng vào dòng lệnh phân tích cú pháp, mà có thể mở lỗ cho các cuộc tấn công tiêm. – falstro
Tôi đã tìm một số hướng dẫn về điều này trên web và hầu hết các ví dụ fork() ed một quá trình mới và thay thế các ngã ba với execvp(). Sau đó, tiến trình cha mẹ chờ quá trình con kết thúc. Đây có phải là hệ thống() nào không? – helpermethod
Vâng, đó là cơ bản những gì 'hệ thống()' nào. Việc gọi 'system()' cũng chạy shell mặc định và chuyển chương trình của bạn làm đối số, điều này sẽ tạo thêm một chút chi phí. – jschmier