4

少し前に、プロセスを強制終了するためにc++コードを作成する必要がありました。私のメインプログラムでは、入力時に異なるファイル名文字列を使用してsystem( "...")を使用して大規模なCAEシステムパッケージを実行します。CAEソフトウェアは、プロセス名に文字列filenameを含む多くのプロセスを作成します。一部のCAEは、シャットダウンする必要があるよりも、worktime > max_timeを処理します。

//filename contains part of CAE-process name
    string s="/bin/kill -9 `ps aux | grep "+filename+" | awk {'print $2'}`";
    system(s.c_str());

出力は次のとおりです。

Usage:
  kill pid ...              Send SIGTERM to every process listed.
  kill signal pid ...       Send a signal to every process listed.
  kill -s signal pid ...    Send a signal to every process listed.
  kill -l                   List all signal names.
  kill -L                   List all signal names in a nice table.
  kill -l signal            Convert between signal numbers and names.

execvpを使用して実行し、bashスクリプトに対してkillまたはpkillを実行して、system( "name_of_script.sh")を呼び出すさまざまな方法を試しました。ここで、スクリプトは含まれていますkill -9 *filename*が、結果は同じでした。
を使用kill/bin/killても同じ出力が得られましたbash -c kill...私のシステム(Ubuntu Natty)から
使用するgnome-terminalkill

kill -9 `ps aux | grep filename | awk {'print $2'}`

必要なすべてのプロセスをシャットダウンしてください!それは動作します。

を使用する場合pkill、理解できるように、それを強制終了するには完全なプロセス名が必要ですが、名前の一部しかありません。

また、pthreadsを使用して計算プロセスを子スレッドにラップし、pthread_cancelで停止しようとしましたが、CAEシステムプロセスがシグナルを受信しないため(私はそれらをトラップすると思います)、それは機能しません。唯一の方法はSIGTERMです。
子スレッドを強制終了する-pthread_killで「ラップ」すると、親(私のメインプログラム)も強制終了されます。

シグナルからkillを呼び出すCAEプロセスpidがわかりません。h
メインプログラムを閉じてもCAEプロセスは停止しません(-Zフラグがないため、プログラムプロセスの子ではありませんか??)

メインプログラムから>MAXTIMEを実行するCAEプロセスを閉じるにはどうすればよいですか?


問題は、QtCreatorのデバッガー(gdb)を介してメインプログラムを実行していたことでした。QtCreatorがないと、シェルスクリプトは引数を使用して正しい方法で実行されますが、引数は両方の方法で正しく渡されます。


また、コマンドラインにファイル名がないが、このプロセスの親または子であるいくつかのCAEプロセスをクリアする必要があります。シェルスクリプトでは、次のものを使用できます。

cat /proc/"$P"/status | grep PPid | grep -o "[0-9]*"

ここ$Pで、は強制終了されたプロセスのpidを持つ変数です。 すべての子プロセスを強制終了するいくつかの方法があります。

smthを書きます。= ppid_of_my main_program/proc/xxxx/statusまでスキャンし、そのブランチをカットするC++でも同様です。PPid

4

2 に答える 2

14

プロセスを強制終了するためにシェルを開く必要はありません。「kill」関数を使用するだけです。

#include <sys/types.h>
#include <signal.h>

int kill(pid_t pid, int sig);

http://linux.die.net/man/2/kill

強制終了するプロセスを見つけるには、次のディレクトリを読んでください。

/ proc / #### / cmdline

ここで、####は実行中のプロセスIDの番号です。したがって、コードは大まかに/ procディレクトリを読み取り、すべての数値ディレクトリを一覧表示します。これらは現在実行中のプロセスであり、そのディレクトリの「cmdline」ファイルでそのプロセスを生成したコマンドの名前を見つけます。次に、正規表現または文字列比較を使用して、強制終了するプロセスを識別できます。

于 2012-08-13T12:56:16.767 に答える
1

これは、ファイル名があまりエキゾチックではないか、正規表現パターンが含まれていると仮定して機能するはずです。

string s="pkill -9 -f "+filename";
system(s.c_str());

ちなみに、これ-9は最後の手段であり、最初から始める必要のあるものではありません。したがって、私はそれほど残忍でないことをお勧めします:

string s="pkill -f "+filename"+";sleep 2; pkill -9 -f "+filename;
system(s.c_str());
于 2013-07-26T22:15:33.177 に答える