【发布时间】:2016-09-27 22:29:53
【问题描述】:
我给出了一些编译好的程序。我想通过程序 stdin 和 stdout 从我的 bash 脚本与它通信。我需要双向沟通。程序不能在信息交换之间被杀死。我怎么能这样做? 简单例子:
让该程序编译为部分求和 (C++),脚本结果将是该总和的平方。程序:
int main() {
int num, sum = 0;
while(true) {
std::cin >> num;
sum += num;
std::cout << sum << std::endl;
}
}
我的脚本应该是这样的:
for i in 1 2 3 4; do
echo "$i" > program
read program to line;
echo $((line * line))
done
如果在程序中我有for(int i = 1; i <= 4; ++i),那么我可以这样做:
exec 4< <(./program); # Just read from program
for i in 1 2 3 4; do
read <&4 line;
echo "sh: $((line * line))";
done
更多请看here。另一方面,如果在程序中我有std::cout << sum * sum;,那么解决方案可能是:
exec &3> >(./program); # Write to program
for i in 1 2 3 4; do
echo "$i" > &3
done
我的问题是与其他进程/程序的双向通信。我不必使用 exec。我无法安装第三方软件。仅 Bash 的解决方案,没有文件,会很好。
如果我运行其他进程,最好知道 pid 在脚本结束时杀死它。
我考虑在未来与两个或三个进程进行通信。第一个程序的输出可能取决于第二个程序的输出,也取决于第二个程序的输出。就像进程的沟通者。
但是,我无法重新编译程序并更改某些内容。我在程序中只有标准输入和标准输出通信。
【问题讨论】:
-
我猜你的 C++ 程序应该支持 POSIX 管道。检查这个答案stackoverflow.com/a/2789967/524743
-
重定向(使用
>或<)不能这样工作。你想要的绝对是管道。 -
@Samuel 谢谢你的回答。如果我可以编辑 Cpp 程序,那么我知道如何在两个进程之间进行通信。但是重新编译程序并改变它是不可能的。我在程序中只有标准输入和标准输出通信。
-
如果您可以安装其他软件,您可以使用 [expect|linux.die.net/man/1/expect]。这样您就可以编写一个交互式过程的脚本。
-
@cb0 Program Expect (5.45) 安装在目标机器上。我会读到它。谢谢。