Popen() や system() を使用せずに名前でプロセスの PID を検索する
質問
プロセス名があるので、 kill()
そのプロセスに信号を送りますが、呼び出すにはその PID が必要です kill()
. 。使用したいのは次のとおりです。
popen("pidof process_name");
最後に。プロセスの PID を確認する他の方法はありますか?私が思いつく方法の 1 つは、そのプロセスにソケット リクエストを送信し、その PID に問い合わせることです。
もう 1 つの方法は、私が書いている単純なコードには少し複雑すぎます。何をすべきか pidofコマンドのソースコード 実際にやっていること(関数呼び出しを使用します) find_pid_by_name()
しかし、それは多くのことを行っています)。
単純な解決策が不可能な場合は、次のことを行う必要があります。
system("pkill <process_name>");
そしてその戻りコードを確認してください。しかし、pkill はすべての Linux マシンで確実に利用できるのでしょうか?
解決
あなたがLinuxを使用した言及しました。それはきれいな解決策はありませんが、/ procを内のすべてのエントリを通過し、あなたが探しているものに対してCMDLINEでプロセス名を確認することができます。
他のヒント
のsysctlを使用してください - <のhref = "http://programming-in-linux.blogspot.com/2008/03/get-process-id-by-name-in-c.html" のrel = "nofollowをnoreferrer 「>例コードする
EDIT - それはここを参照のLinux で利用可能です。
はprocfsは非常に安価であり、多くの人が全く場合その本当に、彼らは/を反復処理するのと同じように/ procを反復処理するのではないと考えます。
読み込み1000年の下にある任意のエントリをスキップすることでいくつかの時間を節約、カーネルスレッドを調べるには意味がありません。 strtointは()のエントリがintであると考え、そのintは1000以上であるのであれば、基本的には...のopendir()の後、わずかに/ proc /%D / STATをお読みください。
それはあなたの信号を受信されるプロセスの状態を言うつもりされていないとして、単に「exeファイル」リンクを解決するための衝動を避けるようにしてください。ターゲットは状態「D」(ディスクスリープ)にある場合たとえば、あなたがDの状態は多年草であれば、信号はすぐに、おそらく決して渡さない、またはされないよう知ってほしいと思います。
調べるために、あなたは多くの場合、最後に到達する前に、ターゲットの道を見つけることができます120のプロセス -ほとんどのシステムでは、70があるように起こっています。
あなたは「私は考えることができ一つの方法は、そのプロセスにソケット要求を送信し、そのPIDに依頼することです。」、言及しますあなたが殺すためにしようとしているプロセスは、あなたが書いたプログラムであるように聞こえる。
その場合は、、実行するcannonicalなことは、プログラムの実行中に(あなたはそれへのアクセス権を持っている場合、通常は/ varの下に/、実行)ファイルにPIDを保存し、プログラムの終了時にファイルを削除することです。そうすれば、プログラムが実行されているか否かを検出することは、
と同じくらい簡単です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ファイルがどのように機能するかについて多くのことを教えてくれます上記のコードのすべての意味合いを注意深く研究。それとも、ただ、より詳細な説明を求めることができます。
これは私のために正常に動作するようです。
あなたは似た名前を持つプロセスを殺すないように、しかし、プロセスの完全なパスを与えたいと思うかもしれません。
このの主な利点は、あなたが送信する信号を指定することができるということです。
system("killall -s 9 process_name");
なぜF_GETOWNでのfcntlを使用しない?
@GregRogersの回答を完了するには、pidofの実装を確認するだけです
- https://gitlab.com/procps-ng/procps/blob/master/pidof.c#L147
- https://gitlab.com/procps-ng/procps/blob/master/proc/readproc.h#L288
- https://gitlab.com/procps-ng/procps/blob/master/proc/readproc.c#L932
ご覧のとおり、/proc ディレクトリのみを検索します。