Linux将连续输出作为命令行参数传递

时间:2014-10-21 09:18:27

标签: c++ linux shell command-line-arguments

我有一个机器视觉程序(./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程序时会出现什么问题?

2 个答案:

答案 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输出换行符然后刷新,所以你要刷新已知的空缓冲区。