我正在运行EDA产品。该产品提供了一个API,我想要输入。但是,输出将提交到文件句柄。即:
getFooData -elem <elem to query> -query <what is queried> -fh <file handle>
这意味着如果我想进行更多的运算,我需要在写入过程完成后读取文件句柄中的输入内容,否则冒险使用O(2)算法。 数据可能非常庞大,我们的文件管理系统很慢/过载/超出配额(或组合)。 有没有办法通过创建一些不向文件系统输出任何内容的文件句柄来“捕获”应该输出到文件句柄的数据?理想情况下,我喜欢这样的事情:
getFooData -elem <elem to query> -query <what is queried> -fh $fh
set m [ getLatestInputOfPipeFh $fh ]
感谢。
答案 0 :(得分:1)
一个选项(Tcl 8.5及更高版本)将创建一个“反射通道”,它是一个内存通道。下面列出的Wiki页面有完整的示例。
假设您的EDA产品仍然停留在8.4(这是相当陈旧的),您将需要使用标准文件或管道。
您没有提到您所使用的操作系统。在unix上,您可以创建命名管道。虽然这将使用文件系统,但文件应保持足够小,以至于它始终保留在内存中。
proc processFooInput { fh } {
set data [gets $fh]
# process data
if {[eof $fh]} {
fileevent $fh readable {}
}
}
set pfn /tmp/fooData
exec mkfifo -m 0666 $pfn
set outfh [open $pfn w]
set infh [open $pfn r]
fconfigure $infh -blocking 0 -buffering line
fileevent $infh readable processFooInput
getFooData -elem <elem to query> -query <what is queried> -fh $outfh
显然,Windows也有通过内部API访问的命名管道,所以它们使用起来有点困难(而且我从未使用它们)。
如果您没有命名管道,则可能需要使用文件:
set sfn /var/tmp/fooData.tmp
set outfh [open $sfn w]
set infh [open $sfn r]
fconfigure $infh -blocking 0 -buffering line
fileevent $infh readable processFooInput
getFooData -elem <elem to query> -query <what is queried> -fh $outfh
参考文献:refchan; wiki: reflected channel; chan; fileevent; fconfigure