![交互程序stdin和stdout(创建一个机器人程序来玩游戏)](https://linux22.com/image/13561/%E4%BA%A4%E4%BA%92%E7%A8%8B%E5%BA%8Fstdin%E5%92%8Cstdout%EF%BC%88%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%9C%BA%E5%99%A8%E4%BA%BA%E7%A8%8B%E5%BA%8F%E6%9D%A5%E7%8E%A9%E6%B8%B8%E6%88%8F%EF%BC%89.png)
设置:
我有一个可执行文件,我“无法编辑”,因为我没有源代码。当我执行该程序时,它会显示一个游戏,它通过 给我一些数字stdout
,供我计算,当我完成计算后,我可以给出我的答案stdin
,它会告诉我计算是否正确。然后我得到一个新的计算,一切都会重复。
问题:
我可以手动玩这个游戏,但我想用程序自动化它。系统上可用的工具是Bash
和C-compiler
。与该程序交互的最简单方法是什么?
到目前为止我所做的:
我一直在查看 中的管道C
,并运行一个小程序,在其中分叉进程并使用管道在两个进程之间进行通信。 (像这样的东西程序)。但是当我从子进程调用外部二进制文件时,我无法让它工作。
答案1
您可以使用管道和 FIFO 来完成此操作。
例如,这是我的测试脚本blackbox.sh
:
#!/bin/bash
# Here i output the value to be added.
echo "10 30"
# Here i read the result and depending on it, write good or not good in a file
read result
if [ "${result}" -eq 40 ]; then
echo good > result.txt
else
echo not good > result.txt
fi
手动运行:
$ ./blackbox.sh
10 30 <~~~~ Script output
40 <~~~~~~~ My input
$ cat result.txt
good
$
mkfifo coin
现在,我使用以下行创建一个 FIFO并再次运行:
$ rm result.txt && cat coin |./blackbox.sh | ( read a b ; echo $((a+b)) > coin )
$ cat result.txt
good
注意:
- 只要未打开 FIFO 进行读取,任何对 FIFO 的写入都会被阻塞。
- 显然,将 的输出通过管道传递
blackbox.sh
给某些东西将使您看不到它。 - 我自愿选择一个简单的示例,其中 blackbox.sh 的输出很容易解析...我让您根据您的需要进行调整。
$(( ))
允许 Bash 中的算术运算。