0

のバージョン 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」です。

質問:

  1. これはバグですか、それとも私が誤用していますかboost::process::wait_for_exit
  2. 移植可能なクラッシュを回避するための回避策はありますか?
4

2 に答える 2

0

あなたのコードを見るだけで、最初に私を襲うのは、wait_for_exit() を呼び出すまで、execute() が成功したかどうかを示す "ec" 変数を実際にテストしていないことです。無効な子プロセスで wait_for_exit() を呼び出すと、クラッシュするのは当然です。

wait_for_exit() を呼び出す前に、「ec」をチェックすることから始めます。

于 2016-01-29T12:09:09.983 に答える
0

したがって、問題はBoost.Test、シグナルスタックを何らかの方法で変更することでした。

このシグナル スタックの変更には相互作用がBoost.Processあり、少なくとも既定のBoost.Test構成では、コードを確実にテストすることはできません。

通常のメインといくつかの関数でテストを書き直したところ、うまくいきました。

于 2016-01-29T14:58:03.350 に答える