2

私の理解では、Windows XP でタスク マネージャーを使用して C++ アプリケーションを強制終了すると、アプリケーションはまだ「きれいに」破棄されます。つまり、コール スタックが巻き戻され、関連するすべてのオブジェクト デストラクタが呼び出されます。ここで私の理解が間違っているかどうかはわかりません。

スタックを巻き戻さずに、そのようなアプリケーションをすぐに強制終了することは可能ですか?

たとえば、アプリケーションは、オブジェクトが破棄されたときにリソースを破棄または解放する RAII パターンを使用する場合があります。タスク マネージャによる従来の "kill プロセス" が適切である場合、アプリケーションをすぐに kill する方法を提供すると、不適切なシャットダウン (停電など) をテストできます。

編集:

明確にするために、私はこれを可能にする既存のユーティリティまたはプログラムを求めていました。ソースコードを持っていないプログラムでソリューションを使用できるはずです。つまり、プログラムによるソリューションは実際には受け入れられません。

編集:

より多くのコンテキストを提供するために、非常に煩わしいサードパーティのサービスを使用する必要がある場合があります(たとえば、1時間ごとに再起動するようにしつこく言われます)。再起動する必要がないことがわかっているので、プロセス/サービスを強制終了して、もうしつこくならないようにします。残念ながら、サードパーティの開発者の中には、私がこれを行うのを妨げるほど「賢い」人もいました。タスクマネージャーでプロセスを強制終了すると、システムはすぐに再起動します (これを実現するために RAII を使用していると思います)。

4

9 に答える 9

8

タスク マネージャーは WM_CLOSE メッセージを送信して "適切な" シャットダウンを試み、アプリケーションが応答しない場合は強制終了されると思います。

この呼び出しは、警告なしでプロセスをすぐに強制終了する必要があります。

TerminateProcess

例えば:

TerminateProcess(GetCurrentProcess(), 1);

アップデート:

この記事は興味深いかもしれません:

終了時間: C++ プログラムの終了

更新 2:

ソースコードを持っていないプログラムでソリューションを使用できるはずです

うーん、これは 99.9% の確率で望ましくない動作です。

SysInternals には次のユーティリティがありますpskill

http://technet.microsoft.com/en-us/sysinternals/bb896683.aspx

しかし、それがどれほど「素晴らしい」かはわかりません。

独自のロールが必要になる場合がありますが、非常に簡単です。

DWORD pid = <get pid from command line>;

TerminateProcess(OpenProcess(PROCESS_TERMINATE, FALSE, pid));
于 2009-08-26T01:52:18.743 に答える
2

私がひどく間違っていない限り(そして確認のために少しテストを行っただけです)、タスクマネージャーは使用しているタブに応じてさまざまな方法でプログラムを閉じようとします。[アプリケーション]タブを通過して[タスクの終了]を押すと、最初にWM_CLOSEを送信して、プログラムを正常に閉じようとします。ただし、[プロセス]タブを通過して[プロセスの終了]を押すと、TerminateProcessの行に沿って何かを使用しているように見えます。つまり、スタックの巻き戻しなどはありません。

したがって、最初に、[プロセス]タブで[プロセスの終了]を使用していない場合は、それを試してください。

それがあなたがすでに試したことであり、彼らのソフトウェアがなんとかしてシステムを再起動することに成功した場合、もっと複雑なことが起こっています。他の人々は、追加のプロセスがあることについて正しい方向に進んでいる可能性があります。

于 2009-08-26T03:52:21.917 に答える
2

サードパーティのツールに依存せずにこれを行う標準的な Windows の方法は、次を使用することtaskkill /fです。

taskkill /f <process-id>
taskkill /f /im <process-executable-name> 

/fここでは「強制」を意味し、クエリや警告なしでプロセスが無条件かつ即時に終了することを保証します。

于 2009-08-26T02:37:17.593 に答える
0

上記のTimが提案したようにPSKillを試してみます。これも失敗すると思います。サードパーティのサービスが死を回避することに真剣に取り組んでいる場合は、サービス定義を「クラッシュ時に再起動」に設定できます。他の一般的なアプローチは、プライマリサービスをウォッチドッグする別のサービスを用意することです。プライマリサービスは通常、グローバルイベントを設定するか、ウォッチドッグサービスが監視するその他の通知メカニズムを採用しています。プライマリサービスがウォッチドッグに通知しない場合、ウォッチドッグはコンピュータを再起動します。

于 2009-08-26T02:16:34.927 に答える
0

適切な名前Kill Toolで、MicrosoftDownloadから入手できます。Windbgスイートの一部でもあります。

Killツールkill.exeは、1つ以上のプロセスとそのすべてのスレッドを終了します。このツールは、ローカルコンピューターで実行されているプロセスでのみ機能します。

kill /f <process>

たとえば、kill /f lsass(冗談ですが、 LSAを殺さないでください!)。自分でロールしたい場合は、TerminateProcessが最適です。

于 2009-08-26T02:17:25.707 に答える
0

標準ライブラリの C 関数 abort() は、クリーンアップなしでアプリケーションを即座に強制終了します。

C++ では、標準のグローバル関数 terminate() が定義されています。それを呼び出すと、アプリケーションも即座に終了します。

技術的には、terminate() の動作は set_terminate 関数によってオーバーライドされる可能性があります。デフォルトでは中止を呼び出します。

于 2009-08-26T02:27:53.817 に答える
0

再起動を禁止できるユーティリティがあります。

たとえば、 HideToolzはそれを行います。どこかに埋め込まれたチェックボックスがあり、何かがいつ再起動を開始するかを尋ねます。多くのアンチウイルスによってルートキットとして検出されるため (これはおそらく飼いならされていると思われます)、完全に制御できないシステムで実行することは問題になる可能性があります (アンチウイルスがドメインポリシーによって義務付けられている場合など)。

于 2009-08-26T02:53:06.037 に答える
0

abort() で異常終了するようです。

ANSI 4.10.4.1 開いているファイルと一時ファイルに関する中止関数の動作 中止関数は、開いているファイルまたは一時ファイルを閉じません。ストリーム バッファをフラッシュしません [source]

現在のプロセスを中止する プログラムの異常終了でプロセスを中止します。この関数は SIGABRT シグナルを生成します。これにより、デフォルトでプログラムが終了し、失敗した終了エラー コードがホスト環境に返されます。プログラムは、自動または静的ストレージ期間のオブジェクトのデストラクタを実行せずに、また atexit 関数を呼び出すことなく終了します。関数が呼び出し元に戻ることはありません。 [ソース]

于 2009-08-26T01:58:04.400 に答える
0

私は C 標準ライブラリ メソッドexit(0);を信じています。まさにそれを行い、デストラクタ、デアロケータなどを呼び出さずにプログラムを中止します.

それを試してみて、それがあなたのニーズを満たすかどうか教えてください。

于 2009-08-26T01:53:02.580 に答える