コンソール アプリケーションから終了値を読み取って、終了する前にそのアプリケーションに関連するすべてのスレッドを終了したいと考えています。
3 に答える
https://stackoverflow.com/questions/298498/c-console-breakingをご覧ください。使用する必要のある標準ライブラリはcsignalです
できることは、アプリを強制的に閉じる(SIGTERM)シグナルを登録し、そこで複数のスレッドを終了するなどのロジックを実行することです。この投稿は、これがWindowsでも機能することを示唆しています。
また、main()などからの通常の終了をキャッチしているように見える関数をatexitに登録することもできますが、ターミナルを閉じることが「通常の終了」としてカウントされるかどうかはわかりません。
これは、Windowsで私にとってはうまくいきます
#include <csignal>
#include <iostream>
#include <ostream>
#include <string>
using namespace std;
namespace
{
volatile sig_atomic_t exit;
void signal_handler(int sig)
{
signal(sig, signal_handler);
exit= 1;
}
}
int main()
{
signal(SIGINT, signal_handler);
signal(SIGTERM, signal_handler);
#ifdef SIGBREAK
signal(SIGBREAK, signal_handler);
#endif
while (!exit)
{
/* do something */
}
// Catch signal here
}
編集:わかりました。プロセスが終了したらすぐに通知を受け取りたいようです。申し訳ありませんが、「出口値」という用語のためにあなたの質問を読み間違えました。APIを介してプロセスを開始すると、ハンドルでCreateProcess()
実行できるはずです。WaitForSingleObject()
この関数は、プロセスが終了するまでブロックされます。したがって、この呼び出し後にプロセスが停止した後に実行するすべてのコードを配置でき、すべて問題ないはずです。
実際にプロセスの終了コードが必要な場合(return X
内main()
):
GetExitCodeProcess()
プログラムで、 WinAPIから使用できます。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms683189(v=vs.85).aspx
シェルで、%errorlevel%
変数を使用します。