kdb可以从命名管道读取吗?
问题描述:
我希望我做错了什么,但似乎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
,但这没有什么区别)。
答
对于read0的算法无法看到它在底层做了什么,但据我所知,它期望有限的流而不是连续的;所以它会阻塞,直到它收到一个EOF信号。
答
当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)
直接...
我很高兴它阻止 - 这似乎是连续流的正确行为 - 但它然后返回空列表,而不是写入的数据。这几乎就像是在等待EOF,然后在该点之前扔掉它所读取的任何东西:s – 2012-02-10 10:45:58
是的,它可能会超时。底层算法将提供答案,因此可能需要发送电子邮件至[email protected]以了解情况。 – algolicious 2012-02-10 11:59:47