LinuxプロセスのPIDが与えられたので、プロセスがまだ実行されているかどうかをCプログラムから確認したいと思います。
kill(2)
システムコールを、_0
_をシグナルとして発行します。呼び出しが成功した場合、このpidを持つプロセスが存在することを意味します。
呼び出しが失敗し、errno
がESRCH
に設定されている場合、そのようなpidを持つプロセスは存在しません。
POSIX標準の引用:
Sigが0(ヌル信号)の場合、エラーチェックは実行されますが、実際には信号は送信されません。 null信号を使用して、pidの有効性を確認できます。
競合状態から安全ではないことに注意してください。ターゲットプロセスが終了し、その間に同じpidを持つ別のプロセスが開始された可能性があります。または、チェック後にプロセスが非常に早く終了する場合があり、古い情報に基づいて決定を下すことができます。
指定されたpidが子プロセスのもの(現在のプロセスからのfork
'ed)の場合のみ、 waitpid(2)
をWNOHANG
と共に使用できますオプション、またはSIGCHLD
シグナルをキャッチしようとします。これらは競合状態から安全ですが、子プロセスにのみ関連します。
Procfsを使用します。
#include <sys/stat.h>
[...]
struct stat sts;
if (stat("/proc/<pid>", &sts) == -1 && errno == ENOENT) {
// process doesn't exist
}
簡単に移植可能
@ blagovest-buyuklievが言ったように、kill(pid, 0)
は典型的なアプローチです。ただし、チェックしているプロセスが別のユーザーに所有されている可能性があり、追加の手順を実行してerrno == ESRCH
、それが判明した
(getpgid(pid) >= 0)
プロセスが特定のPIDを持っているかどうかを判断するための効果的な1ステップの方法です(自分に属していないプロセスでもプロセスグループIDを検査できるため)。
_0
_をシグナルとして使用して、kill(2)
システムコールを発行できます。
_kill -0
_について安全でないものはありません。プログラムは、結果がいつでも時代遅れになる可能性があることを認識しなければなりません(killが呼び出される前にpidが再利用できることを含む)、それだけです。そして、代わりにprocfsを使用しますdoes pidも使用しますが、これはより面倒で非標準的な方法で行います。
/ procファイルシステムメソッドの補遺として、/ proc/<pid>/cmdline(コマンドラインから開始されたと仮定)を確認して、それが目的のプロセスであるかどうかを確認できます。