2008-11-24 38 views
8

Tôi đang cố gắng tìm ra giải pháp tốt nhất cho nonblocking IO qua stdin/stdout với các đặc điểm sau:Cross-nền tảng (linux/Win32) nonblocking C++ IO trên stdin/stdout/stderr

  • Chừng nào có đủ dữ liệu, đọc trong n khối đã chỉnh sửa.
  • Nếu không có đủ dữ liệu, hãy đọc từng phần một phần.
  • Nếu không có sẵn dữ liệu, hãy chặn cho đến khi có một số dữ liệu (mặc dù nó có thể nhỏ hơn n).

Mục đích là cho phép truyền hiệu quả cho các tập dữ liệu lớn trong khi xử lý mã 'kiểm soát' ngay lập tức (thay vì để chúng nằm trong bộ đệm được điền một phần nào đó).

Tôi biết tôi có thể đạt được điều này bằng cách sử dụng luồng và vòng lặp istream :: get() hoặc bằng cách viết một loạt mã dành riêng cho nền tảng (vì bạn không thể chọn() trên các tệp trong cửa sổ). ((Ngoài ra còn có istream :: readome() có vẻ đầy hứa hẹn, nhưng kết quả duy nhất tôi có thể tìm thấy trên google là những người nói rằng nó không thực sự hoạt động tốt.))

Vì tôi chưa làm nhiều mã hóa với các API này, có lẽ có một cách tốt hơn.

Trả lời

6

Có thể boost::asio có thể được sử dụng cho bạn?

+0

Điều đó có vẻ khá hứa hẹn (một cái búa lớn cho một vấn đề nhỏ, nhưng có lẽ đáng học) ... Cảm ơn! –

+0

Vâng, đó có thể là đặt cược tốt nhất của bạn cho I/O không đồng bộ di động, vì ngôn ngữ không có hỗ trợ gốc cho các luồng I/O * hoặc * không chặn. Bạn sẽ phải sử dụng một thư viện của một số loại, và tăng thường là một cược tốt. – jalf

+0

(Nếu chỉ Win32 hỗ trợ select() hoặc poll() trên tay cầm tùy ý thay vì chỉ ổ cắm) ... Sau khi thực hiện một số thao tác, tôi đã xác nhận rằng tôi có thể làm những gì tôi cần và thậm chí có hướng dẫn cài đặt lên: http://www.highscore.de/boost/process/process/tutorials.html#process.tutorials.async_io –

1

Tôi đã sử dụng các chủ đề và mã nền tảng cụ thể. Xem my answer to another question. Tôi đã có thể đưa các công cụ hệ điều hành cụ thể trong inputAvailable() (Linux sử dụng lựa chọn, Windows chỉ trả về true). Sau đó tôi có thể sử dụng WaitForSingleObject() với một thời gian chờ trên Windows để cố gắng để cho thread hoàn thành, sau đó TerminateThread() để giết nó. Rất xấu xí, nhưng nhóm nghiên cứu không muốn sử dụng chút tăng này.

0

Tôi đã làm một cái gì đó tương tự như jwhitlock ... Tôi đã kết thúc với một lớp StdinDataIO bao bọc xung quanh việc triển khai hệ điều hành cụ thể thích hợp (*) sao cho phần còn lại của chương trình của tôi có thể chọn() trên bộ mô tả tập tin mà StdinDataIO cung cấp, còn lại không biết gì về những hạn chế của Windows về stdin. Hãy xem herehere nếu bạn thích, mã này là tất cả giấy phép nguồn mở/BSD được cấp phép.

(*) việc triển khai thực hiện chuyển tiếp đơn giản cho Linux/MacOSX và trong Windows là một quá trình khá phức tạp để thiết lập một chuỗi con để đọc từ stdin và gửi dữ liệu mà nó nhận được qua ổ cắm trở lại chủ đề chính ... không phải là rất thanh lịch, nhưng nó hoạt động.

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