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

标签 c shell pipe

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

./tester | ./program > results.out

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

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

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

但是仅仅这样做是行不通的,所以为了简化问题我制作了两个c程序。 让我们调用一个 pipelinetest1.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

应该打印“test”两次。无论如何,如果我理解正确的话。但它只是挂起。我猜这是因为时间问题,并且它陷入了等待输入的两个函数?

所以我的问题是:

1)我这里还有什么搞砸的吗? 2)或者如果不是,这是一个时间问题吗?是否有一些相对简单的解决方法? 3)这是一个糟糕的想法吗?我应该坚持编写测试程序,这样它就不需要知道响应是什么?

最佳答案

您这里有一个网络,通过通信链路交换流量。通常,stdout 不用于此目的,因此它被设置为保留您的输出,直到有缓冲区,或者,如果涉及终端,直到您切换到读取。

修复方法是切换到行缓冲,因为您的网络数据包是用 \n 分隔的。如果不是,您可以切换到无缓冲,但无论如何,坚持

setvbuf(stdout,0,_IOLBF,0);

在这两个计划中都处于领先位置,您就可以开始了。

关于c - 如何使用管道循环链接两个C程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20232896/

相关文章:

linux - C 程序在将其输出从 bash 脚本重定向到另一个文件时卡在终端上

javascript - 如何使用shell在gulp中读取?

arrays - 如何使用 jq 将 JSON 文件分解为包裹在数组中的较小 json?

c++ - fork 和管道 C++ 奇怪的输出

.net - 如何避免不同用户的多个实例但允许单个用户 session 上的多个实例

c - 在 while 循环中编辑 int 时 C 中的段错误

c - 多个子进程

C - 如何保持变量

python - 在 Python 中,如何将多个进程与 popen 链接在一起,同时将中间部分结果重定向到一个字符串中

c - Fork-exec 管道重定向问题