2011-06-27 35 views
10

Có cách nào để tạo đường ống không bị chặn/không đồng bộ hoặc một cái gì đó tương tự trong vỏ không? Vì vậy, các chương trình có thể đặt các dòng trong đó, những dòng đó sẽ ở lại trong ram, và khi một số chương trình có thể đọc một số dòng từ đường ống, trong khi để lại những gì nó đã không đọc trong nămo? Nó cũng rất có thể xảy ra mà các chương trình có thể được viết và đọc đến nămo này cùng một lúc. Lúc đầu, mặc dù có thể điều này có thể được thực hiện bằng cách sử dụng các tập tin, nhưng sau khi tìm kiếm trên web cho một chút có vẻ như không có gì tốt có thể đến từ thực tế là tập tin được đọc và viết cùng một lúc. Các ống được đặt tên hầu như sẽ hoạt động, chỉ có hai vấn đề: đầu tiên chúng chặn đọc/ghi nếu không có ai ở đầu kia, thứ hai ngay cả khi tôi viết để chặn và đặt hai quy trình để viết vào đường ống trong khi không ai đọc, bằng cách cố gắng viết một dòng với mỗi quy trình, và sau đó thử head -n 1 <fifo> Tôi chỉ nhận được một dòng như tôi cần, nhưng cả hai quy trình viết đều chấm dứt và dòng thứ hai bị mất. Bất kỳ đề xuất?Nonblocking/không đồng bộ nămo/đặt tên đường ống trong hệ thống tập tin/vỏ?

Chỉnh sửa: có thể một số chương trình trung gian có thể được sử dụng để trợ giúp điều này, hoạt động như hòa giải giữa các nhà văn và độc giả?

+2

Bạn có thể làm một cái gì đó như 'mkfs/dev/ram1 1048576' (hoặc một số lớn hơn nếu bạn muốn) và gắn'/dev/ram1' bất cứ nơi nào sau đó. Đó có lẽ là gần với "nonblocking" như bạn có thể nhận được. Nó sẽ, tất nhiên, theo mặc định không phải ở tất cả được nonblocking, chỉ cần rất nhanh (nhưng một đường ống được đặt tên sẽ không được, hoặc theo mặc định). Thao tác Nonblocking là một thứ mà chương trình cần thiết lập trên bộ mô tả tập tin. – Damon

+0

Tôi mặc dù về tùy chọn này, tạo tập tin trong tmpfs hoặc tương tự, nhưng sau đó một lần nữa vấn đề của văn bản và đọc cùng một lúc vẫn tồn tại. Giống như viết và viết từ tệp của nó. Một chương trình ghi vào cuối tập tin, người khác đã đọc một số thông tin từ lúc bắt đầu và bây giờ cần xóa dòng đầu tiên, vì vậy viết ở cuối và xóa ở phía trước cùng một lúc, tôi không thể tìm thấy giải pháp này, tôi đã sử dụng điều này. – morphles

+1

Thật khó (nếu không phải là không thể) để làm một điều như vậy mà không cần viết một chương trình. Một cái gì đó có thể _almost_ làm việc: Đổi tên là nguyên tử, do đó, có thể có mỗi nhà sản xuất viết từng tác vụ riêng biệt cho một tempfile riêng lẻ, đóng tệp và đổi tên nó theo một số mẫu "nổi tiếng". Mỗi người tiêu dùng có thể đổi tên tệp tiếp theo thành một cái gì đó ngẫu nhiên (vì vậy một người tiêu dùng khác sẽ không nhặt nó lên), đọc nội dung và xóa tệp. Mặc dù điều đó sẽ chỉ hoạt động trên một cấp độ công việc (bất kể nhà sản xuất viết như một đơn vị), không phải trên một cấp độ trên mỗi dòng. – Damon

Trả lời

5

Bạn có thể sử dụng chương trình đặc biệt cho mục đích này - bộ đệm. Bộ đệm được thiết kế để cố gắng và giữ cho bên nhà văn liên tục bận rộn để nó có thể truyền khi ghi vào ổ băng, nhưng bạn có thể sử dụng cho các mục đích khác. Bộ đệm bên trong là một cặp quy trình giao tiếp qua một hàng đợi tròn lớn được giữ trong bộ nhớ dùng chung, do đó các quy trình của bạn sẽ hoạt động không đồng bộ. Quá trình đọc của bạn sẽ bị chặn trong trường hợp hàng đợi đầy và quá trình ghi - trong trường hợp hàng đợi trống. Ví dụ:

bzcat archive.bz2 | bộ đệm -m 16000000 -b 100000 | processing_script | bzip2> archive_processed.bz2

http://linux.die.net/man/1/buffer

+0

Cảm ơn bạn đã chỉ ra chương trình mà tôi không biết, có vẻ thú vị và có thể hữu ích trong một số trường hợp. Mặc dù nó không chính xác những gì tôi muốn và tôi sẽ không thể làm những gì tôi muốn với điều này tôi đã quyết định rằng rất có thể tôi sẽ thực hiện chương trình của riêng tôi/daemon cho các trường hợp như tôi. – morphles

+0

Một giải pháp khác sẽ là sử dụng daemon xếp hàng, một thứ giống như bánh răng. "Các dòng" của bạn có thể tồn tại trong memcache dưới dạng công việc. –

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