Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 与流程的双向通信_Linux_Bash - Fatal编程技术网

Linux 与流程的双向通信

Linux 与流程的双向通信,linux,bash,Linux,Bash,我已经给出了一些编译程序。我想通过程序stdin和stdout从bash脚本与它通信。我需要双向沟通。程序之间不能停止信息交换。我怎么能做到? 简单的例子: 让该程序编译为部分求和(C++),脚本结果将是该和的平方。节目: intmain(){ int num,sum=0; while(true){ std::cin>>num; sum+=num; STD::CUT考虑到C++程序从标准输出中读取,并打印到标准输出,很容易将其放在简单的管道链中: command_that_writes_outp

我已经给出了一些编译程序。我想通过程序stdin和stdout从bash脚本与它通信。我需要双向沟通。程序之间不能停止信息交换。我怎么能做到? 简单的例子:

让该程序编译为部分求和(C++),脚本结果将是该和的平方。节目:

intmain(){
int num,sum=0;
while(true){
std::cin>>num;
sum+=num;

STD::CUT

考虑到C++程序从标准输出中读取,并打印到标准输出,很容易将其放在简单的管道链中:

command_that_writes_output | your_cpp_program | command_that_handle_output

在您的特定情况下,您可能需要修改程序,使其仅处理一个输入和写入一个输出,并删除循环。因为这样做非常简单,如下所示:

for i in 1 2 3 4; do
    result=`echo $i | ./program`
    echo $((result * result))
done

如果您有比4.0更新的bash,则可以使用

但是,不要忘记您想要通信的命令的输入/输出可能会被缓冲

在这种情况下,您应该使用类似于stdbuf-i0-o0的

参考:

这里有一个例子

#!/bin/bash
coproc mycoproc {
  ./a.out # your C++ code
}
# input to "std::cin >> num;"
echo "1" >&${mycoproc[1]}
# get output from "std::cout << sum << std::endl;"
# "-t 3" means that it waits for 3 seconds
read -t 3 -u ${mycoproc[0]} var 
# print it
echo $var

echo "2" >&${mycoproc[1]}
read -t 3 -u ${mycoproc[0]} var
echo $var

echo "3" >&${mycoproc[1]}
read -t 3 -u ${mycoproc[0]} var
echo $var

# you can get PID
kill $mycoproc_PID
如果bash早于4.0,则使用
mkfifo
可以执行以下操作:

#!/bin/bash
mkfifo f1 f2
exec 4<> f1
exec 5<> f2
./a.out < f1 > f2 &

echo "1" >&4
read -t 3 -u 5 var
echo $var

rm f1 f2
!/bin/bash
mkfifo f1 f2
执行官4 f1
执行官5 f2
./a.outf2&
回显“1”>&4
读取-t3-u5变量
echo$var
f1至f2室

<代码>我想你的C++程序应该支持POSIX管道。检查这个答案重定向。(使用
@Samuel谢谢你的回答。如果我能编辑Cpp程序,那么我知道如何在两个进程之间进行通信。但无法重新编译和更改程序。程序中只有stdin和stdout通信。如果你能安装其他软件,你可以使用[expect |。这样您就可以编写一个交互式进程的脚本。@cb0 Program expect(5.45)安装在目标计算机上。我将了解它。谢谢。谢谢你的回答,但在我的未简化问题中,第二个数字是给程序依赖者的,它依赖于程序的早期输出,甚至依赖于其他程序输出,所以我不能这样做。@Tacet然后继续管道链?这就是如何将一个程序的输出链接为对另一个的输入是在POSIX世界中完成的。
#!/bin/bash
mkfifo f1 f2
exec 4<> f1
exec 5<> f2
./a.out < f1 > f2 &

echo "1" >&4
read -t 3 -u 5 var
echo $var

rm f1 f2