1

コンソール アプリケーションから終了値を読み取って、終了する前にそのアプリケーションに関連するすべてのスレッドを終了したいと考えています。

ここに画像の説明を入力

4

3 に答える 3

1

https://stackoverflow.com/questions/298498/c-console-breakingをご覧ください。使用する必要のある標準ライブラリはcsignalです

できることは、アプリを強制的に閉じる(SIGTERM)シグナルを登録し、そこで複数のスレッドを終了するなどのロジックを実行することです。この投稿は、これがWindowsでも機能することを示唆しています。

また、main()などからの通常の終了をキャッチしているように見える関数をatexitに登録することもできますが、ターミナルを閉じることが「通常の終了」としてカウントされるかどうかはわかりません。

于 2013-01-13T11:21:34.450 に答える
1

これは、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
}
于 2013-01-13T12:21:27.920 に答える
0

編集:わかりました。プロセスが終了したらすぐに通知を受け取りたいようです。申し訳ありませんが、「出口値」という用語のためにあなたの質問を読み間違えました。APIを介してプロセスを開始すると、ハンドルでCreateProcess()実行できるはずです。WaitForSingleObject()この関数は、プロセスが終了するまでブロックされます。したがって、この呼び出し後にプロセスが停止した後に実行するすべてのコードを配置でき、すべて問題ないはずです。

実際にプロセスの終了コードが必要な場合(return Xmain()):

GetExitCodeProcess()プログラムで、 WinAPIから使用できます。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms683189(v=vs.85).aspx

シェルで、%errorlevel%変数を使用します。

于 2013-01-13T11:21:41.410 に答える