我有一个机器视觉程序(./detectUpdateHomeML
),它使用以下代码连续输出找到的对象名称:
circle( img, center, radius, color, 3, 8, 0 );
if (circle) {
std::cout << " " << cascadeName << " " << timeFound() << endl;
std::cout << std::flush;
}
int timeFound() {
time_t rawtime;
struct tm * timeinfo;
char buffer [80];
time (&rawtime);
timeinfo = localtime (&rawtime);
strftime (buffer,80," %Y-%m-%dT%H:%M:%S",timeinfo);
std:cout << (buffer);
eventCount++;
}
我希望将此输入作为命令行参数发送到第二个程序,使用反向标记捕获输出并将其发送到其他程序,如下所示:
./acceptInput `./detectUpdateHomeML`
然而,这些论点似乎没有传递给./acceptInput
。
我有一个名为./testInput
的测试程序,它只是打印Hello World!
,如下所示:
std::cout << "Hello World!";
使用相同的命令时:
./acceptInput `./testInput`
该程序按预期工作和输出:
There are 3 arguments:
0 ./acceptInput
1 Hello
2 World!
当我尝试将./detectUpdateHomeML
的连续输出传递给./acceptInput
程序时会出现什么问题?
答案 0 :(得分:3)
您的detectUpdateHomeML
似乎会产生您想要使用acceptInput
处理的事件。在这种情况下,您的数据流略有不匹配,您可以使用xargs
解决此问题,如下所示:
./detectUpdateHomeML | xargs -n2 ./acceptInput
当执行带参数的程序时,父进程(例如bash
)需要知道在开始执行之前有多少个参数,所以当你这样做时
./acceptInput `./detectUpdateHomeML`
bash
必须等到detectUpdateHomeML
完成后才开始acceptInput
。
为了在detectUpdateHomeML
仍在运行时使用./detectUpdateHomeML | ...
的输出,请使用管道:
detectUpdateHomeML
这会将xargs
的输出重定向到某个程序的标准输入。
-n
在其输入中接受以空格分隔的文本,并执行将此文本作为参数的子进程。使用2
来确定每次传递的参数数量,例如./detectUpdateHomeML | xargs -n2 ...
:
xargs
./detectUpdateHomeML | xargs -n2 ./acceptInput
也会执行子进程的名称:
detectUpdateHomeML
现在,每次acceptInput
生成两项输出时,detectUpdateHomeML
将以这两个作为参数执行。
每次acceptInput
生成足够的输出时,这将允许您连续运行detectUpdateHomeML
,同时执行{{1}}。这应该可以解决你的问题。
答案 1 :(得分:1)
你没有以正确的方式解决这个问题。当./detectUpdateHomeML
继续运行并输出事件信息时,它需要是acceptInput
的标准输入,而不是后者的命令行参数列表。然后,您将它们链接在管道中而不是使用反向标记:
./detectUpdateHomeML | ./acceptInput
您不应该使用命令行和反引号的原因是,当您执行此操作时,./acceptInput
甚至无法运行,直到./detectUpdateHomeML
终止后,生成其所有输出
另外,在......
std::cout << " " << cascadeName << " " << timeFound() << endl;
std::cout << std::flush;
...第二行不必要,因为endl
输出换行符然后刷新,所以你要刷新已知的空缓冲区。