UNIX C言語プログラミング プロセスの存在を調べる方法
スポンサーリンク
このドキュメントの内容は、以下の通りです。
はじめに
オペレーティングシステムの中では、たくさんのプログラムが動いています。実行中のプログラムのことをプロセスと呼ぶことがあります。マイクロソフトの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)だがerrnoがEPERMなら、そのプロセスは存在するとみなし、その他のエラーの場合はプロセスが存在しないとみなす、というのが最もよく使用される手法のようです。
サンプルコード
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]
スポンサーリンク
スポンサーリンク
いつもシェア、ありがとうございます!
もっと情報を探しませんか?
関連記事
最近の記事
- パナソニック ジェットウォッシャードルツ EW-DJ61-Wのホースの修理
- LinuxセキュリティモジュールIntegrity Policy Enforcement
- アマゾンのEcho Show 5を買ったのでレビューします
- アマゾンのサイバーマンデーはAlexa Echo Show 5が安い
- Android スマートフォン OnePlus 7T と OnePlus 7の違い
- Android スマートフォン OnePlus 7 をAndroid10にアップデートしてみた
- クレジットカードのバーチャルカードの比較のまとめ
- 活動量計 Xiaomi Mi Band 4を買ってみたのでレビュー
- Android スマートフォン OnePlus 7 のレビュー
- AliExpressでスマートフォンを買い物してみた
- パソコンのホコリ対策 レンジフードフィルターと養生テープ
- 80PLUS GOLDのPC電源ユニットAntec NeoEco 750 Goldのレビュー
- イギリスの付加価値税 VAT は払い戻しを受けられる
- イギリスのロンドンでスーツケースなど荷物を預けられる場所は
- イギリスのロンドンで地下鉄やバスに乗るならオイスターカードを使おう
- イギリスのヒースロー空港からロンドン市内への行き方
- 航空便でほかの航空会社に乗り継ぎがある場合のオンラインチェックイン
- SFC会員がANA便ではなくベトナム航空のコードシェアを試して解ったこと
- ベトナムの入国審査でeチケットの掲示が必要だった話
- シアトルの交通ICカードはオルカカード(Orca)です
人気のページ
- Windows7 IME 辞書ツールで単語の登録に失敗しました
- C言語 popen()でコマンドを実行して出力を読み込む
- Windows7で休止状態にする方法
- CentOS MySQLの起動、停止、再起動
- loggerコマンドでsyslogにエラーを出力する方法
- パソコンパーツの買取をしてくれる店のまとめ
- Java Mapの使い方 get(),put(),remove(),size(),clear()
- 楽天のRポイントカードを作ってみた
- iPhone 5 から iPhone 6 に乗り換えたのでレビュー
- netstatコマンドのステータスの意味
スポンサーリンク
過去ログ
2020 : 01 02 03 04 05 06 07 08 09 10 11 122019 : 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