SolarisシステムからC / C ++でプログラムでプロセス情報を取得する方法は?

StackOverflow https://stackoverflow.com/questions/445382

質問

C / C ++ライブラリと、Solaris上でシステムおよびプロセス情報を収集する方法に関するドキュメントはありますか?

コマンドラインツールを解析できましたが、タスクを簡単に実行できるライブラリを使用したいです。

ありがとう

編集: / proc仮想ディレクトリを使用して情報を収集することをお勧めしますが、コマンドラインツールを解析するよりも優れているわけではありません。必要なすべてのデータに対するカスタム解析のようなもの。

WindowsまたはMacOS用のcライブラリのラインに沿って、cベースのシステムAPIを介してこの情報を提供するものを探していますが、Googleには運がありません。

役に立ちましたか?

解決

kstat API でこの種の情報を取得できます。

man -s 3KSTAT  kstat

OpenSolarisでの使用方法を確認できます vmstat および iostat ソース。

processusについては、 ps

他のヒント

Solarisには / proc仮想ディレクトリがあり、あらゆる種類の情報を収集できます。ファイルシステムI / O関数を使用するプロセスについて。

CrashWorksが示唆したように、/ proc virutal dirを使用します。 auxとlinuxの両方でこれを実行しました。覚えておくべきことの1つは、Linuxで/ proc dirを使用したときに、ファイルの形式がカーネルごとに異なることです。

Solaris側の状況はわかりませんが、これはソリューションがソラリスプラットフォーム間で移植できないことを意味する可能性があります。

getrusage()はどうですか?

私は間違いなくこのテーマの専門家ではありませんが、プロセスのスナップショットを撮る必要があったときに、前学期の課題で非常に似たようなことをしました。残念ながら、この方法ではカーネルを掘り下げる必要がありますが、おそらくあなたがしたいことではありません。

この記事が役立つことがわかりました。

とにかくここにスニペットがあります。

 write_lock_irq(&tasklist_lock);
  for_each_process(task) {

    if (system_or_user == 0)
      print_mem_user(task);
    if (system_or_user == 1)
      print_mem_system(task);
  }
  write_unlock_irq(&tasklist_lock);

いくつかのデータ構造をロックダウンする必要があると、カーネルがハングすることがあります。 " for_each_process"どこかで定義されたマクロですが、どのように機能するか覚えていませんD:

static void print_mem_system(struct task_struct *task)
{
  struct mm_struct *mm;

  if (task -> mm == NULL){ // this is how you distinguish system processes from user processes
    myarraypid[totalnumberofprocesses] = task -> pid; // store process id's into myarraypid[], which you can later copy back to user space for printing/display. Additional information would be found in a "task_struct" which is Linux's implementation of a process. 



  }


}

クラスメートの何人かは、異なるアプローチを取り、「ps」のソースに飛び込みました。ユーティリティ。 Linux 2.6.18-92.1.13.e15で作業していたと思います。免責事項:これは私のために働いたが、あなたの走行距離は異なる場合があります。私は非常にうまく壁から離れることができ、間違った方向にあなたを導きたくありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top