web-dev-qa-db-ja.com

pidを指定してプロセスが存在するかどうかを確認します

LinuxプロセスのPIDが与えられたので、プロセスがまだ実行されているかどうかをCプログラムから確認したいと思います。

35
Simone

kill(2) システムコールを、_0_をシグナルとして発行します。呼び出しが成功した場合、このpidを持つプロセスが存在することを意味します。

呼び出しが失敗し、errnoESRCHに設定されている場合、そのようなpidを持つプロセスは存在しません。

POSIX標準の引用:

Sigが0(ヌル信号)の場合、エラーチェックは実行されますが、実際には信号は送信されません。 null信号を使用して、pidの有効性を確認できます。

競合状態から安全ではないことに注意してください。ターゲットプロセスが終了し、その間に同じpidを持つ別のプロセスが開始された可能性があります。または、チェック後にプロセスが非常に早く終了する場合があり、古い情報に基づいて決定を下すことができます。

指定されたpidが子プロセスのもの(現在のプロセスからのfork 'ed)の場合のみ、 waitpid(2)WNOHANGと共に使用できますオプション、またはSIGCHLDシグナルをキャッチしようとします。これらは競合状態から安全ですが、子プロセスにのみ関連します。

70

Procfsを使用します。

#include <sys/stat.h>
[...]
struct stat sts;
if (stat("/proc/<pid>", &sts) == -1 && errno == ENOENT) {
  // process doesn't exist
}

簡単に移植可能

  • Solaris
  • IRIX
  • Tru64 UNIX
  • BSD
  • Linux
  • IBM AIX
  • QNX
  • Bell Labsのプラン9
15
Janus Troelsen

@ blagovest-buyuklievが言ったように、kill(pid, 0)は典型的なアプローチです。ただし、チェックしているプロセスが別のユーザーに所有されている可能性があり、追加の手順を実行してerrno == ESRCH、それが判明した

(getpgid(pid) >= 0)

プロセスが特定のPIDを持っているかどうかを判断するための効果的な1ステップの方法です(自分に属していないプロセスでもプロセスグループIDを検査できるため)。

12
the paul

_0_をシグナルとして使用して、kill(2)システムコールを発行できます。

_kill -0_について安全でないものはありません。プログラムは、結果がいつでも時代遅れになる可能性があることを認識しなければなりません(killが呼び出される前にpidが再利用できることを含む)、それだけです。そして、代わりにprocfsを使用しますdoes pidも使用しますが、これはより面倒で非標準的な方法で行います。

3
Hallvard

/ procファイルシステムメソッドの補遺として、/ proc/<pid>/cmdline(コマンドラインから開始されたと仮定)を確認して、それが目的のプロセスであるかどうかを確認できます。

0
Kinthelt