2012-02-09 87 views
5

我希望我做錯了什麼,但似乎kdb無法從命名管道讀取數據(至少在Solaris上)。它會阻塞,直到它們被寫入,但不會返回任何寫入的數據。kdb可以從命名管道讀取嗎?

我可以創建一個文本文件:

$ echo Mary had a little lamb > lamb.txt 

和KDB會很樂意閱讀:

q) read0 `:/tmp/lamb.txt 
enlist "Mary had a little lamb" 

我可以創建一個命名管道:

$ mkfifo lamb.pipe 

,並試圖閱讀從它:

q) read0 `:/tmp/lamb.pipe 

將導致kdb阻塞。寫管道:

$ cat lamb.txt > lamb.pipe 

會導致KDB返回空列表:

() 

可以從KDB命名管道讀?我應該放棄嗎?我不認爲這是一個權限的事情(我試圖在我的mkfifo命令上設置-m 777,但這沒有什麼區別)。

回答

0

對於read0的算法無法看到它在底層做了什麼,但據我所知,它期望有限的流而不是連續的;所以它會阻塞,直到它收到一個EOF信號。

+0

我很高興它阻止 - 這似乎是連續流的正確行爲 - 但它然後返回空列表,而不是寫入的數據。這幾乎就像是在等待EOF,然後在該點之前扔掉它所讀取的任何東西:s – 2012-02-10 10:45:58

+0

是的,它可能會超時。底層算法將提供答案,因此可能需要發送電子郵件至[email protected]以瞭解情況。 – algolicious 2012-02-10 11:59:47

2

read0失敗時,您可以經常使用system"cat ..."來僞造它。 (我試圖讀取/ proc中的東西,也不會read0合作時,發現了這個原本。)

q)system"cat /tmp/lamb.pipe" 
<blocks until you cat into the pipe in the other window> 
"Mary had a little lamb" 
q) 

只是知道有一個相當高的開銷(如這樣的事情在Q去)用於調用system - 它產生一個整體的shell進程剛剛運行無論你的命令是

您可能還可以直接與custom C extension做到這一點,可能調用read(2)直接...

4

隨着發行kdb+ v3.4 Q具有支持命名管道:根據是否OU想實現一個流算法或從管道剛讀上一個FIFO管道請使用.Q.fpsread1

要實現流,你可以這樣做:

q).Q.fps[0N!]`:lamb.pipe 

然後$ cat lamb.txt > lamb.pipe

會打印

, 「瑪麗有隻小羊羔」

你的q會話。通過用適當的函數代替0N!可以實現更有意義的算法。

要閱讀文件的上下文到一個變量做:

q)h:hopen`:fifo://lamb.pipe 
q)myText: `char$read1(h) 
q)myText 

「瑪麗有隻小羊羔\ n」 個

查看更多有關命名管道here