5

プロセス名kill()があり、そのプロセスにシグナルを送信する必要がありますが、呼び出すにはその PID が必要kill()です。私は使用したいだけです:

popen("pidof process_name");

最後に。プロセスの PID を調べる他の方法はありますか? 私が考えることができる 1 つの方法は、そのプロセスにソケット要求を送信し、その PID を要求することです。

もう 1 つの方法は、私が書いている単純なコードには少し複雑すぎます: pidof コマンドのソース コードが実際に行っていることを行うためです (関数呼び出しを使用しますfind_pid_by_name()が、多くのことを行っています)。

簡単な解決策が不可能な場合は、これを行う必要があります。

system("pkill <process_name>");

戻りコードを確認します。しかし、pkill はすべての Linux マシンで確実に利用できるのでしょうか?

4

7 に答える 7

4

あなたはLinuxを使用していると述べました。これは最もクリーンな解決策ではありませんが、/proc のすべてのエントリを調べて、探しているものに対して cmdline のプロセス名を確認できます。

于 2008-12-17T16:29:32.793 に答える
3

sysctl を使用する -コード例

編集 - Linuxで利用可能ですこちらをご覧ください

于 2008-12-17T16:04:48.617 に答える
2

「私が考えることができる1つの方法は、そのプロセスにソケット要求を送信し、そのPIDに要求することです」とあなたは言います。あなたが殺そうとしているプロセスはあなたが書いたプログラムのようです。

その場合、一般的な方法は、プログラムの実行中にpidをファイル(通常は/ var / runの下にあり、アクセスできる場合)に保存し、プログラムの終了時にファイルを削除することです。そうすれば、プログラムが実行されているかどうかを検出するのは簡単です。

if kill -0 $(cat /var/run/myprog.pid 2>/dev/null) 2>/dev/null; then
    echo Running!
else
    rm -f /var/run/myprog.pid
    echo "Not running."
end

上記のコードのすべての意味を注意深く研究することで、PIDファイルがどのように機能するかについて多くのことを学ぶことができます。または、より詳細な説明を求めることもできます。

于 2009-05-21T04:20:29.160 に答える
2

Procfs の読み取りは非常に安価です。多くの人は、 /proc を反復処理することを / を反復処理するように考えていますが、実際にはまったくそうではありません。

1000 未満のエントリをスキップして時間を節約してください。カーネル スレッドを調べても意味がありません。したがって、基本的に .. opendir() の後、strtoint() がエントリが int であると判断し、その int が 1000 以上である場合は、/proc/%d/stat を読み取るだけです。

「exe」リンクを解決したいという衝動を避けるようにしてください。シグナルを受信するプロセスの状態がわからないからです。たとえば、ターゲットが状態 'D' (ディスク スリープ) にある場合、D 状態が永続的である場合、信号がすぐに配信されないか、おそらくまったく配信されないことを知りたいと思うでしょう。

ほとんどのシステムでは、70 から 120 のプロセスを調べる必要があり、最終的に到達する前に目的の方法を見つけることがよくあります。

于 2009-01-17T15:37:39.110 に答える
0

これは私にとってはうまくいくようです。

ただし、同様の名前を持つプロセスを強制終了しないように、プロセスの完全なパスを指定することをお勧めします。

これの主な利点は、送信したいシグナルを指定できることです。

system("killall -s 9 process_name");
于 2008-12-17T16:17:59.387 に答える
0

F_GETOWN で fcntl を使用しないのはなぜですか?

于 2009-01-17T14:43:03.430 に答える