No.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 など)それを利用したほうが効率がよく、確実にプロセスの終了を検知できるプログラムを書けるでしょう。
No.1
- 回答日時:
popen が一番楽ではないかと。
FILE* fp = popen("ps aux","r");
...
参考URL:http://www.linux.or.jp/JM/html/LDP_man-pages/man …
ありがとうございます。
やってみたんですが、プロセスがいつ死んだかを常にスキャンし続けるため、popenを連発することになるのですが、そうするとそれらが全て別プロセスとして発生するので、popenのプロセスがかなり大量に発生し、スマートじゃありません。その結果かどうか分かりませんが、処理が長くなりすぎるとプログラムが途中で落ちてしまいました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 バッチファイルでのエクスプローラー終了 1 2022/05/30 14:32
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- iCloud AppleID サポートからのメール 3 2023/07/05 15:14
- その他(ソフトウェア) ソフトが異常終了します 1 2022/08/28 01:41
- その他(動画サービス) xvideosからいきなりメール来て削除されました 下記の通りです 僕はもしかして悪用されてますか 2 2022/10/10 19:18
- 政治 私は文部科学省ヘ入り込んで投稿した私の建議文を彼らが私の依頼まましましょうか。? 2 2023/08/22 07:08
- 環境学・エコロジー 二酸化炭素の排出 1 2023/08/07 16:40
- Visual Basic(VBA) 【ExcelVBA】Powerクエリーでいうピボット解除と同じ処理をVBAで 4 2022/07/06 17:09
- 哲学 真実の信仰=真理の探究 1 2022/11/26 09:03
- 数学 論理 数学 ∃について 添付の問題がよくわかりません。 例えば1題目、∃xとあったらまず何を考えるの 3 2022/07/09 21:13
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
プロセスIDの取得方法
C言語・C++・C#
-
コマンド(例えばls)の出力結果を文字列で取得するプログラムの作成方法
C言語・C++・C#
-
実行プログラム名の取得
C言語・C++・C#
-
-
4
C言語で、メモリを解放しないで終わるプログラム
C言語・C++・C#
-
5
C言語 exitの使い方
C言語・C++・C#
-
6
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
7
C++言語で、構造体のコピーは可能(しても良い)のでしょうか?
C言語・C++・C#
-
8
acceptをalarmでタイムアウトさせる処理がうまくいきません
C言語・C++・C#
-
9
ファイル書込みで一行もしくは部分的に上書きする
PHP
-
10
C言語初心者の質問失礼します。
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
Visual C++からpingを実行して...
-
explorer.exeが異様にメモリを食う
-
ウィンドウのタイトルからプロ...
-
API関数 GetExitCodeProcess
-
プロセスIDからウィンドウハ...
-
WINのタスクマネージャの強制終了
-
タスクマネージャーのプロセス...
-
Linuxでのスレッド間メッセージ...
-
EXE間でデータを受け渡し時のka...
-
C++のプログラムをバックグラウ...
-
完全な乱数を生成する方法
-
WebBrowserでPDF表示でのトラブル
-
VB.NET 自プログラムのプロセス...
-
Windowsでのfork方法
-
ADOでアクセスのレコードに...
-
sleep関数の精度について
-
別のプロセスの関数を呼び出す...
-
VBでエクセルを起動し、プロ...
-
C#でのbatファイル実行結果取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
なぜ女性は男性が忘れたことを...
-
タスクマネージャーのプロセス...
-
プロセスのアタッチ・デタッチ...
-
非表示になったエクセルは?
-
Process.Startの戻り値を後で取得
-
C#でのbatファイル実行結果取得
-
プロセスIDからウィンドウハ...
-
c言語でプロセスIDを調べたい
-
Linuxでのスレッド間メッセージ...
-
プロセスIDの取得方法について
-
ADOでアクセスのレコードに...
-
怪しいプロセス教えてください。
-
vb.netでEXCEL起動がうまくでき...
-
別のプロセスの関数を呼び出す...
-
C++のプログラムをバックグラウ...
-
Visual C++からpingを実行して...
-
VBS(WSH)で開いたIEのウィンド...
-
IISがフリーズ
おすすめ情報