Tôi không muốn sử dụng hệ thống() trong chương trình C của mình, bởi vì hệ thống (3) khối và đây không phải là những gì tôi muốn. Cách tối ưu để làm điều đó là gì?thay thế hệ thống() bằng chức năng không chặn
Trả lời
Tôi nghĩ rằng hành động nhanh và bẩn là gọi sytem (lệnh &). & sẽ sinh ra quy trình mới.
Sử dụng fork()
để tạo quy trình mới và sau đó sử dụng system()
(hoặc bất kỳ chức năng exec
) nào trong đó. Quá trình ban đầu sẽ có thể tiếp tục thực hiện.
Bạn có thể muốn sử dụng popen
. Nó tạo ra các quy trình mới và cho phép bạn chuyển hướng đầu ra của quy trình tới quy trình của riêng bạn.
Nếu trong cửa sổ, hãy sử dụng chức năng ShellExecute()
từ API Windows.
Nếu trong Unix, hãy truy cập fork()
rồi system()
như đã đề cập.
Câu trả lời phụ thuộc vào mục tiêu thực sự của bạn là gì. Bạn không nói những gì bạn đang ở trên nền tảng, và tôi biết rất ít về Windows, do đó, điều này chỉ bao gồm các tùy chọn của bạn trên linux/unix.
Bạn chỉ muốn tạo chương trình khác và không cần tương tác với chương trình đó. Trong trường hợp này, hãy gọi
fork()
và sau đó trong quá trình con chạyexecve()
(hoặc chức năng liên quan).Bạn muốn tương tác với một chương trình khác. Trong trường hợp này, hãy sử dụng
popen()
.Bạn muốn một phần chương trình của mình chạy dưới dạng tiến trình con. Trong trường hợp này, hãy sử dụng
fork()
và gọi bất kỳ chức năng nào bạn cần để chạy trong trẻ.Bạn cần tương tác với một phần của chương trình đang chạy dưới dạng tiến trình con. Hãy gọi
pipe()
để bạn có bộ mô tả tệp để giao tiếp, sau đó gọifork()
và sử dụng cặp mô tả tệp để giao tiếp. Ngoài ra, bạn có thể giao tiếp thông qua một ổ cắm, hàng đợi tin nhắn, bộ nhớ dùng chung, v.v.
Đẹp tóm tắt của các tùy chọn ở bàn tay, và làm thế nào để lựa chọn giữa chúng. –
'fork()' sau đó 'system()' sẽ để lại một quá trình vô ích treo xung quanh cho vỏ để kết thúc. Tốt hơn là gọi 'execve()' hoặc tương tự trong tiến trình con thay vì 'system()'. Nếu bạn muốn sử dụng các tính năng của trình bao, thì hãy thực hiện lệnh '/ bin/sh'. – jilles
@jilles - Tốt, cảm ơn. Đã chỉnh sửa để sửa. – bstpierre
- 1. Chức năng không chặn PHP
- 2. Thay thế chức năng không thay thế
- 3. Thay thế Hệ thống WinRT.Environment.TickCount
- 4. Chức năng chặn là gì?
- 5. Gọi chức năng NT trên hệ thống trước NT
- 6. Chức năng hệ thống của C++ là gì?
- 7. Move thế hệ chức năng thành viên
- 8. Hệ thống Tìm/Thay thế Độc đáo Không Hoạt động
- 9. Phiên bản không bị chặn của hệ thống()
- 10. Làm thế nào để loại bỏ quá trình nền từ cuộc gọi chức năng hệ thống
- 11. Chức năng Thay thế Regex bằng Dao cạo
- 12. Chức năng này có thể được triển khai với hệ thống kiểu của Haskell không?
- 13. thay thế cho chức năng ngủ
- 14. Xác định thư viện hệ thống Linux nào có chức năng
- 15. thay thế các ví dụ chức năng
- 16. Chức năng eval thay thế là gì?
- 17. Chức năng từ 'thay thế' kiểu lớp
- 18. Chức năng thay thế để dán
- 19. Thay thế UIViewController trong hệ thống phân cấp UINavigationController
- 20. Thay đổi ngày hệ thống lập trình
- 21. XSLT 1.0 chuỗi thay thế chức năng
- 22. Vĩnh viễn thay thế một chức năng
- 23. thay thế cho PHP exec() chức năng
- 24. Truy tìm cuộc gọi hệ thống chặn C
- 25. Chức năng thay thế XSLT không tìm thấy
- 26. Thay đổi ngôn ngữ hệ thống C#
- 27. Đây có phải là cách hay để chặn cuộc gọi hệ thống không?
- 28. Javascript ngăn chặn chức năng ẩn danh?
- 29. Làm thế nào tôi có thể lưu trữ đầu ra chức năng hệ thống của Perl thành một biến?
- 30. Biên soạn trên hệ thống 64 bit cho hệ thống 32 bit - khả năng tương thích
Tuyệt đối +1. 'system()' là nền tảng phụ thuộc anyway. Thay vì tạo một mớ hỗn độn của nguồn của bạn bằng 'fork()' hoặc các công cụ như thế, hãy sử dụng hệ vỏ mà 'system()' cung cấp cho bạn quyền truy cập vào. – DevSolar
giải pháp tuyệt vời tốt hơn nhiều so với ngã ba nếu bạn aks tôi –