2011-06-27 128 views
10

有沒有辦法在shell中創建非阻塞/異步命名管道或類似的東西?因此,程序可以在其中放置行,這些行將保持內存,並且當某些程序可以從管道讀取一些行時,同時留下未在fifo中讀取的行嗎?程序也很有可能在同一時間寫入和閱讀到這個FIFO。起初,雖然也許這可以使用文件來完成,但是在搜索網頁之後,似乎沒有什麼好處可以來自文件同時讀取和寫入的事實。命名管道幾乎可以工作,只是有兩個問題:第一,如果在另一端沒有人,則阻止讀/寫;第二,即使我讓寫入被阻塞,並設置兩個進程寫入管道,而沒有人讀取,通過嘗試在每個進程中寫入一行,然後嘗試head -n 1 <fifo>我只需要一行,但兩個寫入過程都會終止,而第二行會丟失。有什麼建議麼?shell/filesystem中的非阻塞/異步FIFO /命名管道?

編輯:也許一些中間程序可以用來幫助這個,作爲作家和讀者之間的中介?

+2

你可以做類似'的mkfs的/ dev/RAM1 1048576'(或更大的數字,如果你想),並安裝'的/ dev/ram1'任何地方即可。這可能與您可以獲得的「非阻塞」接近。當然,默認情況下,它根本不是非阻塞的,只是速度非常快(但默認情況下,命名管道也不會)。非阻塞操作是程序需要在文件描述符上設置的操作。 – Damon

+0

我雖然關於這個選項,但在tmpfs或類似文件中創建文件,但是同時又一次寫入和讀取的問題依然存在。更像是自文件以來的寫作和寫作。一個程序寫入文件結尾,另一個從頭讀取一些信息,現在需要刪除第一行,所以寫在最後和刪除在同一時間,我找不到解決方案,我會用這個。 – morphles

+1

很難(如果不是不可能的話)在不編寫程序的情況下做這樣的事情。可能最重要的工作:重命名是原子的,所以每個生產者可以將每個單獨的任務寫入單獨的臨時文件,關閉文件並根據某種「衆所周知的」模式對其進行重命名。每個消費者可以將下一個文件重命名爲隨機文件(以便其他消費者不會選擇它),讀取內容並刪除文件。雖然這隻能在每個任務級別上(無論生產者是否作爲一個單元編寫),而不是按行級別。 – Damon

回答

5

您可以使用特殊程序來達到此目的 - 緩衝區。緩衝區旨在嘗試使寫入端不斷繁忙,以便在寫入磁帶驅動器時能夠流式傳輸,但可用於其他目的。內部緩衝區是一對進程通過共享內存中的大型循環隊列進行通信,因此您的進程將異步工作。如果隊列已滿並且寫入程序進程(如果隊列爲空),則讀者進程將被阻止。示例:

bzcat archive.bz2 | buffer -m 16000000 -b 100000 | processing_script | bzip2的> archive_processed.bz2

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

+0

謝謝您指出我不知道的程序,看起來很有趣,並且在某些情況下可能會有用。雖然它不完全是我想要的,我也無法做到我想要的,但我決定最有可能實施我自己的程序/守護程序來處理像我這樣的案例。 – morphles

+0

另一個解決方案是使用隊列守護進程,就像齒輪工人一樣。您的「行」可能會在作爲作業的memcache中持續存在。 –