2012-02-09 84 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