私はいくつかのコンパイルされたプログラムを与えました。私はプログラムstdinとstdoutでbashスクリプトからそれと通信したい。私は双方向コミュニケーションが必要です。情報交換の間にプログラムを殺すことはできません。私はそれをどのようにすることができますか? 簡単な例:プロセスと双方向通信
このプログラムを部分集計(C++)でコンパイルし、スクリプト結果をその合計の2乗にします。プログラム:
int main() {
int num, sum = 0;
while(true) {
std::cin >> num;
sum += num;
std::cout << sum << std::endl;
}
}
私のスクリプトはそのように見えるはずです。もっと見hereについて
exec 4< <(./program); # Just read from program
for i in 1 2 3 4; do
read <&4 line;
echo "sh: $((line * line))";
done
:
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)
を持っている場合は、私はそのような何かを行うことができます。一方からは、プログラムの中で、私はstd::cout << sum * sum;
を持っている場合、その解決策は次のようになります。
exec &3> >(./program); # Write to program
for i in 1 2 3 4; do
echo "$i" > &3
done
私の問題は、他のプロセス/プログラムとの双方向通信です。私はエグゼクティブを使う必要はありません。私はサードパーティのソフトウェアをインストールすることはできません。ファイルのないBash専用のソリューションは素晴らしいでしょう。
私は他のプロセスを実行すると、スクリプトの最後にpidを殺すことを知ってうれしいです。
今後2つのプロセス、あるいは3つのプロセスとの通信を考えます。 firsプログラムの出力は、第2プログラムの出力に依存してもよく、第2プログラムの出力に依存してもよい。プロセスのコミュニケータと同様。
しかし、私はプログラムを再コンパイルして何かを変更することはできません。私は、プログラムでは標準と標準コミュニケーションしか持っていません。
あなたのC++プログラムはPOSIXパイプをサポートしているはずです。この回答を確認してくださいhttp://stackoverflow.com/a/2789967/524743 – Samuel
リダイレクション( '>'や '<を使用)は、そのようには動作しません。あなたが欲しいのは間違いなくパイプ*です。 –
@Samuelあなたの答えに感謝します。私がCppプログラムを編集できるのであれば、私は2つのプロセス間の通信方法を知っています。しかし、プログラムを再コンパイルして変更することは不可能です。私はプログラムの中でstdinとstdoutのコミュニケーションしか持っていません。 – Tacet