- ベストアンサー
c言語でプロセスIDを調べたい
unixのコマンドで ps aux と打つと "ユーザー名" "プロセスID" 。 。 。 。 がでますけど、この2番目の"プロセスID"を調べる関数ってありますか? ※というのも、プロセスID(ジョブ番号)を引数にして、そのプロセスが終了したら何か処理をさせるというプログラムを作りたいからです。よろしくお願いします。
- taurus4_ikeda
- お礼率47% (10/21)
- C・C++・C#
- 回答数2
- ありがとう数3
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
最適な方法はOSの種類によって異なるのですが、最近の UNIX なら procfs が /proc にマウントされていることがあり(機能としてprocfsが用意されていても、デフォルトインストールだとマウントされていない場合もあります)、これを利用する方法が考えられます。 procfs は 仮想的なファイルシステムで、たとえばプロセスID 12345のプロセスが存在する場合は、/proc/12345 というディレクトリが(勝手に)出来、その中にプロセスに関する詳細情報を得ることができる仮想的なファイルが(やはり勝手に)配置されます。そして、プロセスが消えると、それらのディレクトリ・ファイルは消滅します。 (どのような詳細情報を得られるかはOSによって大きく異なるようです。) この "/proc/12345" などのパス(ディレクトリ)が存在するかどうかを stat(2)などでテストすれば、特定のPIDのプロセスが存在するかがわかります。 int pid = 12345; /* 調べたい PID */ char path[50]; struct stat sb; snprintf(path, 50, "/proc/%d", pid); if(stat(path, &sb) == 0) { /* プロセスが存在する */ } else { /* 存在しない */ } なお、この方法では、当然ながらプロセスが終了したかどうかを一定時間毎に stat(2)を呼んで調べる必要があるという問題があります。また、監視対象のプロセスが終了した後に、同じPIDでまったく別のプロセスが上がってくるケースも理論上は考えられ、statを呼び出す時間間隔によっては、そのようなケースでは監視対象プロセスの終了を検出できない、というおそれもあります(最近のUNIXでは、一度使用したPIDはなるべく再利用しないようになっている場合が多いので、その確率は非常に小さいですが)。 OSによっては、特定のプロセスが終了したことをカーネルが能動的に通知してくれる機能が提供されている場合がありますので(FreeBSD なら kqueue など)それを利用したほうが効率がよく、確実にプロセスの終了を検知できるプログラムを書けるでしょう。
その他の回答 (1)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
popen が一番楽ではないかと。 FILE* fp = popen("ps aux","r"); ...
お礼
ありがとうございます。 やってみたんですが、プロセスがいつ死んだかを常にスキャンし続けるため、popenを連発することになるのですが、そうするとそれらが全て別プロセスとして発生するので、popenのプロセスがかなり大量に発生し、スマートじゃありません。その結果かどうか分かりませんが、処理が長くなりすぎるとプログラムが途中で落ちてしまいました。
関連するQ&A
- プロセスが起動中かどうかを判定するコマンドはありますか?
あるプログラムを起動したとします。 psコマンドで起動中のプロセス番号を知ることができるのはわかりますが、 プログラム起動中かどうかを判定するコマンドとかあるでしょうか。 たとえば、 >あるコマンド プロセスID のようにプロセスIDを引数として実行すると、プロセス起動中かどうか判定できるような。。。 ご存知な方ご教授おねがいします。
- ベストアンサー
- Solaris系OS
- ウインドウのプロセス終了について
今C++でタスクバーのウインドの列挙を行い、またプロセスIDの取得を できたのですがこれらを終了させる方法がわかりません。 いろいろ調べてみたのですが、UNIXでのkillコマンドに匹敵する 関数がわかりません。 自分が調べたところ使えそうなのは。 CloseMainWindow関数 TerminateProcess関数 などができそうなのではと考えています。 また http://akky.cjb.net/mfc/appclose.html ここに書いてあるソースを打ってみたのですが、 思うように動きませんでした。 どうしたらよいでしょうか。 具体的な方法(プログラム)がほしいです。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- プロセスIDの再利用
こんちにちは、honiyonです。 親子関係のない全く別々に起動されたプロセスの終了するプログラムを作ろうと思います。 .NETではシステムで一意なIDというものがある、という情報を見かけたのですが、.NETは使用したくないのでプロセスIDを使って監視出来ないかと考えています。 プロセスIDを使って、定期的にポーリングする方法をとったとき、 プロセスIDが再利用されてしまう事で終了を検知出来ない事があるのではという疑問が出てきました。 UNIXでは極力重複しない(再利用しない)という方針があるようですが、Windowsではそのような仕組みはありますでしょうか? そのような仕組みがあれば、再利用による検知ミスは無視出来るレベルの問題かなと考えています。 また、プロセスIDでの監視以外で良い手段がありましたら、是非ご教授頂ければ幸いです。 宜しくお願いします(..
- 締切済み
- C・C++・C#
- プロセスIDの取得(タスクバーのみ)
似たような質問ですがわからないことがあるので質問します。 Enumwindows関数でタスクバーにあるウインドウ(トップレベルウィンドウ)を列挙することはできましたが、そのプロセスIDを表示させることができませんでした。 別のプログラムでプロセスIDを表示させることはできましたが そのプログラムですとすべてのプロセスを表示することになるので これでは自分のやりたい事と少し違うので困っています。 どうしたらタスクバーにあるプロセスIDをとりだすことができるので しょうか? 自分では GetWindowThreadProcessId関数 EnumChildWindows関数 を使用すればいいと思ってますが、具体的なプログラムが くめていません。 どうかよろしくおねがいします。
- ベストアンサー
- C・C++・C#
- C言語でホスト(Unix)にプログラム/プロセスを送信して実行する方法
C言語でホスト(Unix)にプログラム/プロセスを送信して実行する方法を探しています。 用途はまだ具体的に決まってませんが 例えば、ある与えられたコマンドを各ホストに一斉送信して その結果をまとめて取得する、ようなことがしたいです。 どんなに難しくなってもいいので、いい方法や関数があったら教えて下さい。
- 締切済み
- C・C++・C#
- windowsのプロセスIDやスレッドIDの使い道
win32APIで取得したプロセスIDやスレッドIDの使い道について教えてください。 CreateProcessなどで取得したプロセスのハンドルやスレッドのハンドルはwin32APIで使う場面がありますが、プロセスIDやスレッドIDの使い道がわかりません。 どのような場面でプロセスIDやスレッドIDを使うのでしょうか?具体的にこんな事をするときに使うよなどあれば教えていただきたいです。 プロセスIDやスレッドIDを引数にとるAPI関数などがあれば教えていただきたいです。
- ベストアンサー
- その他(プログラミング・開発)
- プロセスIDの取得方法
Unix C++でプロセスIDの取得方法を教えてください。 (見当違いの質問だったらすみません) 親プロセス(自分)のプロセスIDと、親プロセスの起動した子プロセスのプロセスIDを取得したいです。 また、親プロセスの起動した子プロセスのプロセスIDを使って親プロセス終了時に子プロセスをkillしたいと思うのですが、 具体的にどうすればいいかわからず困っています。
- ベストアンサー
- C・C++・C#
- 外部プロセスを終了したい!!
こんにちは。 ご多忙の中、申し訳ありませんが皆さんの知恵をお貸しください。 私はVBは初心者中の初心者なのですが、 あるアプリケーションからEXEをキックし(このEXEは永久ループ)、 ある程度の処理をしたら、キックしたEXEを終了させたいと考えております。 基本的にキックされたEXEがウェイトして自らおちるのではなく、キックした アプリから落としたいと考えています。 簡単に言えば、UNIXでいうKILLコマンドのような関数はありますかと 言うことです。(プロセスIDを使用して・・・) ご存知の方がいらっしゃいましたら、教えてください。 宜しくお願い致します。m(_ _)m
- ベストアンサー
- Visual Basic
- C言語でプロセスを処理するプログラムを考えています。
C言語でプロセスを処理するプログラムを考えています。 popenを使ってプロセスを起動しようとしたですが、popenが未定義の関数とエラーが出てコンパイルできません。 ヘッダにstdio.hはおいてあります。 コンパイラはborlandを使用しています。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- UNIX C言語 複数プロセスの起動方法
UNIX C言語の質問です。 複数プロセスの起動の仕方を教えてください。 あるプログラムは、ユーザーからの入力待ち状態になると同時に、所定時間のタイマーを起動し、ユーザーからの入力がなく、所定時間が経過したら、待ち状態を解除する ということをしたいと思っています。 今の考えでは、 ある Aプロセスから、Bプロセス(タイマー)を起動し、Bプロセスが所定時間をカウントし、タイマー満了後、Aプロセスに通知する ということがしたいと思っています。 UNIX、Cともに初心者です。 大変、初歩的な質問で申し訳ありませんが、ご助言お願いいたします。
- ベストアンサー
- C・C++・C#
お礼
ありがとうございます。 /proc以下にファイルができるんですね。 おかげで良いプログラムができました。