2010-02-18 50 views

Trả lời

10

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 
} 
7

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.

+1

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

+0

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

+1

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

5

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.

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