のバージョン 0.5 を使用していBoost.Process
ます。ドキュメントはここにあります。Mac OS X Yosemite を使用しています。
私の問題: コンパイルを子プロセスとして起動しています。プロセスが完了するのを待ちたいと思います。
子プロセスが正しくコンパイルされると、すべて問題ありません。
しかし、子プロセスがコンパイルされない場合、 を呼び出すとコードがクラッシュするようboost::process::wait_for_exit
です。
私のユーザーコードは次のようになります。
編集: コードは、最新のより正確なバージョンに一致するように編集されています (まだ機能しません)。
s::error_code ec{};
bp::child child = bp::execute(bpi::set_args(compilationCommand),
bpi::bind_stderr(outErrLog_),
bpi::bind_stdout(outErrLog_),
bpi::inherit_env(),
bpi::set_on_error(ec));
bool compilationSuccessful = true;
if (!ec) {
s::error_code ec2;
bp::wait_for_exit(child, ec2);
if (ec2)
compilationSuccessful = false;
}
の内部実装bp::wait_for_exit
:
template <class Process>
inline int wait_for_exit(const Process &p, boost::system::error_code &ec)
{
pid_t ret;
int status;
do
{
ret = ::waitpid(p.pid, &status, 0);
} while ((ret == -1 && errno == EINTR) || (ret != -1 && !WIFEXITED(status)));
if (ret == -1) {
BOOST_PROCESS_RETURN_LAST_SYSTEM_ERROR("waitpid(2) failed");
}
else
ec.clear();
return status;
}
::waitpid
コンパイル コマンドが失敗すると、後のコードには到達しません。表示されるエラーは、「子が終了しました。pid: xxxx; uid: yyy; 終了値: 1」です。
質問:
- これはバグですか、それとも私が誤用していますか
boost::process::wait_for_exit
。 - 移植可能なクラッシュを回避するための回避策はありますか?