1

私の Qt C++ プログラムでは、次のようにプロセスを作成しました。

myProcess = new QProcess();
myProcess->start(programpath, arguments);

プロセスの終了は、次のように処理されます。

myProcess->terminate();

QProcess::kill()terminate()またはで子プロセスを終了するとclose()動作しますが、終了する前に子プロセスをクリーンアップする機会が与えられないため、使用したくありません。

プロセスを終了する他の方法はありますか? ありがとう!

4

2 に答える 2

2

丁寧な方法は、親プロセスが子プロセスに終了するように丁寧に依頼することです。次に、子プロセスが(独自の意志で)終了すると、QProcessオブジェクトはfinished(int、QProcess :: ExitStatus)シグナルを発行し、そのシグナルに接続されたスロットを使用して、プロセスを続行できます(たとえば、その時点でのQProcessオブジェクト)。(または、Qtイベントループをしばらくブロックしてもかまわない場合は、QProcessオブジェクトを終了するように要求した後にwaitForFinished()を呼び出すだけで、プロセスが終了するまで、またはwaitForFinished()は戻りません。タイムアウト期間が経過しました)

もちろん、上記が機能するためには、子プロセスに終了を求める何らかの方法が必要です。それをどのように行うかは、子プロセスが実行している内容によって異なります。運が良ければ、子プロセスのコードを制御できます。その場合、親プロセスのアクションに応じて終了するように変更できます。たとえば、子プロセスがstdinのときに終了するようにコーディングできます。記述子が閉じられ、親プロセスがQProcessオブジェクトでcloseWriteChannel()を呼び出して、それが発生するようにします。または、Linux / Unixで実行している場合は、子プロセスにSIGINTシグナルを送信し、子プロセスがシグナルをキャッチして正常なシャットダウンを開始するハンドラーを設定できます。または、本当に愚かなものが必要な場合-迅速で汚い、子プロセスに、既知の場所(たとえば、「/ tmp / hey-child-process-PIDNUMBERHERE-go-away.txt」など)にファイルが存在するかどうかを定期的にチェックさせ、親プロセスがそのようなファイルを作成します。子供が立ち去りたいとき。概念実証としての場合を除いて、あまり堅牢ではないと思うので、最後の方法をお勧めするわけではありません。

于 2012-12-03T04:33:16.253 に答える
2

terminate実際には、プロセスをクリーンアップする機会を与えます。終了するプログラムは、その機会を利用する必要があります。つまり、システムはSIGTERMとアプリケーションを送信し、それを無視して、自然に終了することができます。これでも十分でない場合は、アプリケーションに終了を求める独自の方法を実装する必要があります。Jeremy Friesner はいくつかの成功を収めました。アプリケーションコードが自分で書かれていない場合は、そのプログラムのドキュメントをよく読む必要があります。おそらく、その方法がドキュメントに記載されています。

于 2012-12-03T11:34:59.253 に答える