如何使用管道循环链接两个c程序?

时间:2013-11-27 02:38:34

标签: c shell pipe

我正在为一个基本上是在终端上实现的游戏的程序编写测试人员。用户输入命令,打印响应等。为了测试它,我想使用程序或多或少地随机打印命令,然后将其传递给正在测试的程序。将程序的输出保存到文件中,让测试人员保存它给出的命令。这会创建一个日志,如果发生了不好的事情,您可以看到导致它的一系列命令。这很简单:

./tester | ./program > results.out

但是对于“较不随机”的部分,有助于能够实际看到程序的响应并使用scanf或其他东西来提取有关游戏状态的信息(即测试人员发送命令以显示卡片手,然后做某种逻辑来决定下一个要发送的命令)。

基于this question和其他人,创建循环本身似乎很简单:

mkfifo fifo
./tester < fifo | ./program > fifo
rm fifo

但只是这样做不起作用,为了简化问题我已经制作了两个c程序。 让我们调用一个pipetest1.c:

#include <stdio.h>
int main() {  
char input[10];
printf("test\n");   
scanf("%s",input);
printf("%s\n",input);   
return 0;
}

另一个pipetest2.c:

#include <stdio.h>
int main() {
char input[10];
scanf("%s",input);  
printf("%s\n",input);
scanf("%s",input);
printf("%s\n",input);   
return 0;
}

然后做

mkfifo fifo
./pipetes1 < fifo | ./pipetes2> fifo
rm fifo

应该打印两次“测试”。如果我还是正确地理解了这一点。但相反它只是挂起。我猜的是因为时间问题而且两个函数都在等待输入?

所以我的问题是:

1)我在这里搞砸了别的什么吗? 2)如果没有,这是一个时间问题,是否有一些相对容易的解决方案? 3)这是一个可怕的想法,我应该坚持写测试人员,以便它不需要知道答案是什么?

1 个答案:

答案 0 :(得分:1)

你在这里有一个网络,通过通信链路交换流量。通常情况下,没有使用stdout,所以它设置为保持输出直到有缓冲区,或者如果有一个终端,直到你切换到读取。

修复是切换到行缓冲,因为您的网络数据包是\n分隔的。如果他们不是你可以切换到没有缓冲,但不管怎样,坚持

setvbuf(stdout,0,_IOLBF,0);

预先在两个节目中,你很高兴。