Tất cả các vỏ Unix (mà tôi biết) thực hiện đường ống vỏ thông qua một cái gì đó khác với một pty (thông thường, chúng sử dụng các đường ống Unix! -); do đó, thư viện thời gian chạy C/C++ trong cpp_program
sẽ BIẾT đầu ra của nó KHÔNG phải là thiết bị đầu cuối, và do đó nó S buffer đệm đầu ra (theo khối của một vài KB tại một thời điểm). Trừ khi bạn viết shell của riêng bạn (hoặc semiquasimaybeshelloid) mà thực hiện đường ống thông qua pyt's, tôi tin rằng không có cách nào để làm những gì bạn yêu cầu bằng cách sử dụng ký hiệu đường ống.
Điều "shelloid" được đề cập có thể được viết bằng Python (hoặc trong C, hoặc Tcl, hoặc ...), sử dụng mô-đun pty
của thư viện chuẩn hoặc mức trừu tượng cao hơn dựa trên nó như pexpect, và thực tế là hai chương trình được kết nối thông qua một "đường dẫn dựa trên pty" được viết bằng C++ và Python là khá không liên quan. Ý tưởng chính là để lừa chương trình bên trái của đường ống tin rằng stdout của nó là một thiết bị đầu cuối (đó là lý do tại sao một pty phải ở gốc của lừa) để đánh lừa thư viện thời gian chạy của nó vào NOT đệm đầu ra. Khi bạn đã viết một shelloid như vậy, bạn sẽ gọi nó bằng một số cú pháp như:
$ shelloid 'cpp_program | Tất nhiên nó sẽ dễ dàng hơn để cung cấp một "giải pháp điểm" bằng cách viết python_program
trong kiến thức rằng nó phải sinh ra cpp_program
như là một tiến trình con và lừa nó tin rằng stdout của nó là một thiết bị đầu cuối (tức là, Ví dụ: python_program
sau đó sẽ sử dụng trực tiếp pexpect
). Nhưng nếu bạn có hàng triệu tình huống như vậy mà bạn muốn đánh bại bộ đệm bình thường được thực hiện bởi thư viện thời gian chạy C do hệ thống cung cấp, hoặc nhiều trường hợp bạn muốn sử dụng lại các bộ lọc hiện có, v.v, viết shelloid
thực sự có thể thích hợp hơn.
Nguồn
2009-09-11 02:35:11
Bạn đang nói đến bao nhiêu đầu ra? Có bộ đệm liên quan, vì vậy bất cứ điều gì dưới 4K sẽ luôn luôn là một điều duy nhất. –
là không có cách nào để quyết định * khi * bộ đệm nên được đỏ mặt? –