15

次のメンバー関数を持つクラスがあります。


/// caller pid
virtual pid_t Pid() const = 0; 

/// physical memory size in KB
virtual uint64_t Size() const = 0;  

/// resident memory for this process
virtual uint64_t Rss() const = 0; 

/// cpu used by this process
virtual double PercentCpu() const = 0; 

/// memory used by this process
virtual double PercentMemory() const = 0; 

/// number of threads in this process
virtual int32_t Lwps() const = 0; 

このクラスの義務は、呼び出し元に関するプロセス情報を返すことです。物理メモリサイズは sysctl 呼び出しで簡単に決定でき、pid は些細なことですが、ps または top で popen を呼び出して出力を解析することを除いて、残りの呼び出しは私にはわかりませんでした。これは受け入れられません。どんな助けでも大歓迎です。

要件:
g++ 4.0 でコンパイル
obj-c
OSX 10.5なし

4

5 に答える 5

14

プロセス情報は次から取得されpidinfoます:

cristi:~ diciu$ grep proc_pidinfo /usr/include/libproc.h

int proc_pidinfo(int pid, int flavor, uint64_t arg,  void *buffer, int buffersize);

CPU負荷は次から来ますhost_statistics

cristi:~ diciu$ grep -r host_statistics /usr/include/

/usr/include/mach/host_info.h:/* host_statistics() */

/usr/include/mach/mach_host.defs:routine host_statistics(

/usr/include/mach/mach_host.h:/* Routine host_statistics */

/usr/include/mach/mach_host.h:kern_return_t host_statistics

詳細については、topおよびlsofのソースを確認してください。これらはオープン ソースです (Apple 開発者として登録する必要がありますが、無料です)。

https://opensource.apple.com/source/top/top-111.20.1/libtop.c.auto.html

後で編集:これらのインターフェイスはすべてバージョン固有であるため、製品コード (libproc.h) を作成するときはそれを考慮する必要があります。

/*
 * This header file contains private interfaces to obtain process information.
 * These interfaces are subject to change in future releases.
 */
于 2008-10-21T06:00:16.160 に答える
7

あなたはObjective-Cがないと言っているので、MacOSフレームワークのほとんどを除外します。

getrusage() を使用して CPU 時間を取得できます。これにより、プロセスに課金されるユーザーおよびシステム CPU 時間の合計が得られます。CPU のパーセンテージを取得するには、1 秒に 1 回 getrusage 値のスナップショットを作成する必要があります (または任意の粒度で)。

#include <sys/resource.h>

struct rusage r_usage;

if (getrusage(RUSAGE_SELF, &r_usage)) {
    /* ... error handling ... */
}

printf("Total User CPU = %ld.%ld\n",
        r_usage.ru_utime.tv_sec,
        r_usage.ru_utime.tv_usec);
printf("Total System CPU = %ld.%ld\n",
        r_usage.ru_stime.tv_sec,
        r_usage.ru_stime.tv_usec);

getrusage 構造には RSS フィールドがありますが、MacOS X 10.5 では常にゼロのように見えます。Michael Knightは、RSS を決定する方法について数年前にブログ記事を書きました。

于 2008-10-21T02:11:56.573 に答える
2

Mac OS のプロセス情報には、以下のコードを使用できます。

void IsInBSDProcessList(char *name)    { 
  assert( name != NULL); 
  kinfo_proc *result; 
  size_t count = 0; 
  result = (kinfo_proc *)malloc(sizeof(kinfo_proc)); 
  if(GetBSDProcessList(&result,&count) == 0) { 
    for (int i = 0; i < count; i++) { 
      kinfo_proc *proc = NULL; 
      proc = &result[i]; 
      }
  } 
  free(result);
}

kinfo_proc 構造体には、プロセス識別子 (pid)、プロセス グループ、プロセス ステータスなど、プロセスに関するすべての情報が含まれています。

于 2013-05-13T12:52:17.453 に答える
2

これらの値のほとんどは Mach API で利用できると思いますが、そこをいじってからしばらく経ちました。あるいは、「ps」または「top」コマンドのソース コードを見て、それらがどのように機能するかを確認することもできます。

于 2008-10-20T23:51:59.307 に答える
0

この情報のほとんどはGetProcessInformation()から取得できます。

ところで、なぜプロセス全体の情報を返す関数の仮想メソッドなのですか?

これはCARBONのみで、ココアには使用できません

于 2008-10-20T23:55:14.557 に答える