说,我正在编写一些工具集,其中每个工具在相同的文本数据流上运行,解析它,对其执行一些操作并使用与原始输入中相同的语法返回文本流。工具可以 在管道中组合(与其他unix工具/脚本/任何东西一起)。因为 文本输入处理(解析)相当昂贵,我想避免它以防万一 工具集中的两个或多个工具在管道中一个接一个地使用 而不是二进制流(直接存储在内存结构中,没有无用的“额外”解析)。是吗 可能知道(使用一些技巧,进程间通信,或其他任何)if 工具“之前”或“之后”管道中的任何工具都是工具集的一部分?我想是的 unix env。没有为这种“信号”(AFAIK)做好准备。谢谢你的想法...
答案 0 :(得分:4)
不,管道连接的进程没有双向通信的方法。如果解析真的那么昂贵以至于这是必要的(我猜它不是,但是对它进行描述),那么你有两个我能想到的选择:
如果用户需要足够的知识,请让每个工具允许标志告诉他们期望二进制输入并提供二进制输出,以便用户可以链接:
tool1 -o | tool2 -i -o | tool3 -i -o | tool4 -i
其中-o
表示提供二进制输出,-i
表示接受二进制输入。
答案 1 :(得分:1)
你当然可以在工具链中讨论过程,但这需要一些工作。一个想法是让工具集中的每个进程使用pgid(管道中每个进程的pgid是相同的)来确定共享内存名称,然后将其输入流的pid和inode写入共享内存。然后,工具集中的每个进程都将知道管道中也在管道中的其他进程。如果inode匹配,他们将知道他们的邻居是否在工具集中。
答案 2 :(得分:1)
另一种方法是让所有工具读取文本或二进制表示,可能由文件开头的幻数表示。命令行选项可以选择输出格式。 根据用途,最好将二进制文件设为“默认”,并选择带有选项的文本输出。
prog0 -binout <input.file | prog1 -binout | prog2 >output.file
VS
prog0 <input.file | prog1 | prog2 -txtout >output.file
如果二进制幻数由非ASCII字节组成,则不需要文本格式的幻数。