スポンサーリンク

このドキュメントの内容は、以下の通りです。

はじめに

オペレーティングシステムの中では、たくさんのプログラムが動いています。実行中のプログラムのことをプロセスと呼ぶことがあります。マイクロソフトのWindowsのタスクマネージャでは、プロセスと呼ばれるタブがあり、実行中のプロセス(プログラム)の一覧が表示されています。LinuxやFreeBSDなどのUnix系オペレーティングシステムも実行中のプロセス・コマンドのことをプロセスを呼びます。プログラムの中には、ほかのプロセス(プログラム)が動作しているか確認することが役割のプログラムもあります。

プロセスが存在している(生きている)かどうかを確認するケースは、いろいろなシーンでありますが、たとえば、Unix のデーモンプロセスを起動するときに、すでに存在していないかを確認したりします。実行したいプログラムのデーモンがすでに動作している場合、さらに起動しようとすると二重起動になってしまいます。デーモンによっては、デーモンの起動時に、pid ファイルと呼ばれるプロセスID(プロセス番号)を書き込んだファイルを作成してます。そのPIDファイルをもとに、まだ、デーモンプロセスが存在しているかどうかを確認します。

pidファイルの拡張子

pid ファイルの拡張子には、 .pid が使われます。たとえば、 sshd の場合では sshd.pid というファイルが作成されます。

pidファイルの置き場所

FreeBSDの場合は、主要なデーモンのpidファイルは、 /var/run に置かれています。

FreeBSDの環境で /var/run を確認ましたので、以下に示します。
$ ls /var/run/*.pid
/var/run/cron.pid      /var/run/httpd.pid     /var/run/sshd.pid
/var/run/devd.pid      /var/run/sendmail.pid  /var/run/syslog.pid

sshdのpidファイルの例

FreeBSDのsshdのpidファイルは、 /var/run/sshd.pid です。以下に示す通り、sshd.pid には、プロセスIDが書いてあります。
$ cat /var/run/sshd.pid
746

pgrepコマンドとpidファイルを使用して、プロセスが存在するかを確認できます。
$ pgrep -F /var/run/sshd.pid
746

C言語でプロセスの存在を確認する方法

UNIX環境のC言語でプロセスが動作しているか調べるには、システムコールのkill(2)関数を利用します。

プロトタイプ

killシステムコールの書式は以下の通りです。
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);

シグナル番号には、0を使用します。

サンプルコード

サンプルコードを以下に示します。
int exist_process (pid_t pid)
{
	int r = kill (pid, 0);
	if (r == 0)
	{
		// pid は存在する
		return (1);
	}

	// pid は存在しない
	return (0);
}

単純にはこれでいいのですが、kill()が-1を返しても、プロセスが存在するかもしれません。そのため、エラー番号を示す errnoを確認する必要があります。

kill()が-1を返し、 errno が ESRCH の場合は、プロセスの存在を調べられません。セキュリティが強化されたシステムかもしれません。

kill()が-1を返し、 errno が EPERMの場合は、そのプロセスにシグナルを送る権限がありません。プロセスは存在するかもしれませんし、セキュリティが強化されていて、どのプロセスにもシグナルが送れないことを示しています。


kill()が成功(0)した場合と、kill()は失敗(-1)だがerrnoEPERMなら、そのプロセスは存在するとみなし、その他のエラーの場合はプロセスが存在しないとみなす、というのが最もよく使用される手法のようです。

サンプルコード

errno とEPERMを考慮した例を示します。
int exist_process (pid_t pid)
{
	int r = kill (pid, 0);
	if (r == 0)
	{
		// pid は存在する
		return (1);
	}
	if (EPERM == errno)
	{
		// 存在すると見なす
		return (1);
	}

	// pid は存在しない
	return (0);
}

さいごに

これに関連する記事を紹介いたします。
C言語のerrnoの実装(FreeBSD)については、 [2007-12-22-1] で解説しています。
forkシステムコールの使い方については、[2007-12-21-1] で解説しています。
waitシステムコールの使い方については、[2007-12-21-2] で解説しています。

これらの記事を参考にしていただければ幸いです。
参照しているページ (サイト内): [2007-12-23-2] [2007-12-23-1]

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

スポンサーリンク
 

過去ログ

2020 : 01 02 03 04 05 06 07 08 09 10 11 12
2019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー