2017-12-04 24 views
2

boost::process::childを待つ間に、「正常かどうか」を終了したかどうかをどのように知ることができますか?boost :: processプロセスが "正常に終了したか"終了したかを知る方法?

のは、私がprocessusを作成しましょう:

myprg.exeがある
boost::process::child child("myprg.exe", "5000"); 
child.wait(); 
int res = child.exit_code(); 

int main(int argc, char* argv[]) 
{ 
    if (argc == 2) 
    { 
     boost::this_thread::sleep(boost::posix_time::milliseconds(atoi(argv[1]))); 
     return 1; 
    } 

    return 0; 
} 

注:成功した場合、この意味をなさないMCVEは、私がメインの同意は0を返す必要があります。

は、私がどのように知ることができ、それは(インスタンスまたはWindows Process Managerのchild.terminateを使用して)待っている間、誰かがプロセスを殺す場合child.exit_code()が1のとき、child.exit_code()は、最終的には、だから、1

を返すことを見ますこれがプロセスのメインエントリ関数によって返された値である場合、またはプロセスが終了した場合は?

1はプロセスが強制終了されたことを意味しますか?それから、プログラムは1を返して、この終了コードを残して、それが殺されてきて、きれいに終了しなかった特定の状況を特定すべきですか?

もしそうでなければ、boost::process APIは、プロセスが正常終了したのか、または殺されたのかを知るための何かを提供しますか?

+0

を追加します。プラットフォームに依存しない方法がありますが、プロセスグループを使用してCHLDシグナルを処理することができます。つまり、Boost Process APIの抽象化を破ることです。 – sehe

答えて

2

したがって、最後にchild.exit_code()が1の場合、これがプロセスのメインエントリ関数によって返された値か、プロセスが強制終了されたかどうかをどのように知ることができますか?

できません。

1はプロセスが強制終了されたことを保証しますか?

によって異なります。 Windowsはthisによれば答えは1ですがどこにも記載されていません。終了したプロセスの戻りコードは、プロセスを終了するインスタンスによって決まることに注意してください。ブーストの機能を終了するために、1は詳細/窓/ terminate.hppの内側に見つけた:

inline void terminate(child_handle &p) 
{ 
    if (!::boost::winapi::TerminateProcess(p.process_handle(), EXIT_FAILURE)) 
     boost::process::detail::throw_last_error("TerminateProcess() failed"); 

    ::boost::winapi::CloseHandle(p.proc_info.hProcess); 
    p.proc_info.hProcess = ::boost::winapi::INVALID_HANDLE_VALUE_; 
} 

だから、しかし、1プロセスは任意の値を返すことができます。1.であるかもしれない、常にEXIT_FAILUREを返しています。

あなたのプロセスが正常に終了したかどうかを完全に確実かつ移植性のある方法で区別するためには、リターンコードを評価するだけで、独自の通信メカニズムを実装する必要があります。

0

子プロセスでエラーハンドラを設定して、別の終了コードを返すことができます。たとえば、STLライブラリから

int main(int argc, char* argv[]) 
{ 
    std::set_terminate([](){ exit(2); }); 
    if (argc == 2) 
    {   
     boost::this_thread::sleep(boost::posix_time::milliseconds(atoi(argv[1]))); 
     return 1; 
    } 
    return 0; 
} 
関連する問題