外部のexeファイルと入出力のやり取りを双方向に行うプログラム

実現したいこと

C++を用いて、既に用意されている外部のexeファイルと入出力のやり取りを双方向に行うプログラムを書きたいです。実現困難なら次点でRust、続いてGoを用いたいと考えています。

前提

言語はC++、OSはWindows11です。Pythonのsubprocessモジュールで所望の機能を持つプログラムを実現できたのですが、C++で実現する良い方法は無いのでしょうか?具体的な良い方法を知りたいです。プログラムの速度低下とメモリ消費は望んでいないため、WSLは使用したくないです。

考えられる解決策と試したこと

自分なりに調べた結果、実現するためには以下の方法が有力と分かりました。
(1)C++のpopenモジュールを使う
外部プログラムに入力だけを行うプログラムなど片方向のやり取りならpopenを使ったプログラムが検索にヒットしますが、双方向のやり取りを実現しているプログラムは全然ヒットしませんでした。辛うじてhttps://stackoverflow.com/questions/6171552/popen-simultaneous-read-and-write
が有益そうな情報としてヒットしましたが、windows環境では使用できないモジュールを使っています。上記の理由でWSL使用はしたくありません。

(2)<windows.h>のCreateProcessモジュールを使う
公式ドキュメント読んだりしましたが、windows apiが自分にとっては難しい上に双方向のやり取りに関する情報量が少ないため実装は極めて困難です。また、上記のように片方向なら検索にヒットしますが。。。

(3)他の方が用意したモジュールを使う
boostライブラリのboost::processを利用する方法を実際にやってみましたが、自力では解決不能なエラーが多発しました。また、
https://github.com/tsaarni/cpp-subprocess
https://github.com/arun11299/cpp-subprocess
などは良さげなモジュールで、導入には成功したものの解決不能なエラーが発生しました。

(4)C++のstd::systemでPythonを呼び出し、subprocessを使う
Pythonで所望の機能を持つプログラムを実現できたことを生かすならこの方法ですが、プログラム全体で外部のexeファイルとの入出力のやり取りを何百万回といった膨大な回数行いたいため、pythonを呼び出して更にsubprocessを呼び出す時間的コストが不安です…

総括

このように、どの方法も個人的な事情で難点があります。C++で所望のプログラムを実現する方法は他にありますか?また、もし無理であれば、最終的手段としてRust、Goで良い方法があるか具体的に教えていただきたいです。

コメントを投稿

0 コメント