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.
- 1. Khi nào bạn nên sử dụng JCR và khi nào bạn nên sử dụng JPA/RDBMS?
- 2. Khi nào tôi nên sử dụng require() và khi nào nên sử dụng define()?
- 3. Khi nào tôi nên sử dụng setUpClass và khi __init__?
- 4. Khi nào tôi nên sử dụng adorners?
- 5. CompositeWPF: EventAggregator - khi nào nên sử dụng?
- 6. Khi nào tôi nên sử dụng AQL?
- 7. Khi nào nên sử dụng ko.utils.unwrapObservable?
- 8. Khi nào tôi nên sử dụng SynchronousQueue
- 9. Khi nào tôi nên sử dụng GC.SuppressFinalize()?
- 10. Khi nào nên sử dụng AccessController.doPrivileged()?
- 11. Khi nào tôi nên sử dụng ConcurrentSkipListMap?
- 12. Khi nào nên sử dụng kênh đệm?
- 13. Khi nào chúng ta nên sử dụng mutex và khi nào chúng ta nên sử dụng semaphore
- 14. C# Khi nào tôi nên sử dụng Danh sách và khi nào tôi nên sử dụng danh sách array?
- 15. Khi nào tôi nên sử dụng stdClass và khi nào tôi nên sử dụng một mảng trong mã php oo?
- 16. Trong Jira Agile khi nào tôi nên sử dụng "Story" và khi nào tôi nên sử dụng "Cải tiến"
- 17. Khi nào tôi nên sử dụng Gói-Nhập khẩu và khi nào tôi nên sử dụng Yêu cầu-Gói?
- 18. Khi nào tôi nên sử dụng kiểu trừu tượng trong các hệ thống nhúng
- 19. Khi nào nên sử dụng node.js và khi nào sử dụng ajax?
- 20. Khi nào nên sử dụng Class.isInstance() và khi nào thì sử dụng toán tử instanceof?
- 21. Khi nào nên sử dụng và khi nào không sử dụng Try Catch Cuối cùng
- 22. Khi nào chúng ta nên sử dụng lớp học và khi chúng ta không nên
- 23. Khi nào bạn nên sử dụng IEnumerable và GetEnumerator?
- 24. khi nào tôi nên sử dụng _mm_sfence _mm_lfence và _mm_mfence
- 25. Khi nào nên sử dụng <%# ... %> và <%= ... %>?
- 26. Khi nào tôi nên sử dụng perror ("...") và fprintf (stderr, "...")?
- 27. Khi nào và ở đâu tôi nên sử dụng WCF
- 28. Khi nào tôi nên sử dụng remove_reference và add_reference?
- 29. Khi nào nên sử dụng $ HTTP_POST_VARS ['field'] và $ _POST ['field']?
- 30. readValue và readTree ở Jackson: khi nào nên sử dụng?
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