سؤال

لدي الدرجة التالية وظائف الأعضاء:


/// 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 تافهة, ولكن ما تبقى من المكالمات استعصت لي جانبا من الاحتجاج popen على ps أو أعلى و تحليل الإخراج - وهي ليست مقبولة.أي مساعدة سيكون موضع تقدير كبير.

المتطلبات:
ويجمع على g++ 4.0
لا obj-c
OSX 10.5

هل كانت مفيدة؟

المحلول

معلومات عملية تأتي من pidinfo:

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

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

تحميل وحدة المعالجة المركزية يأتي من 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, ، فهي مفتوحة المصدر (تحتاج إلى تسجيل مع أبل لكن هذا مجانا):

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.
 */

نصائح أخرى

وبما انك تقول لا هدف-C سنقوم استبعاد معظم الأطر ماك.

ويمكنك الحصول على وقت وحدة المعالجة المركزية باستخدام getrusage ()، والذي يعطي المبلغ الإجمالي من المستخدم وCPU نظام الوقت المحتسب إلى العملية الخاصة بك. للحصول على نسبة CPU كنت بحاجة إلى لقطة من القيم 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);

وهناك حقل RSS في بنية getrusage، ولكن يبدو أن تكون دائما صفر في ماك X 10.5. مايكل نايت كتب بلوق إضافة منذ عدة سنوات حول كيفية تحديد RSS.

وأعتقد أن معظم هذه القيم متوفرة في API ماخ، لكنها كانت فترة من الوقت منذ ان كنت مطعون حولها في هناك. بدلا من ذلك، هل يمكن أن مجرد إلقاء نظرة على الكود ل"ملاحظة" أو "الأعلى" الأوامر، ونرى كيف تفعل ذلك.

ويمكنك استخدام رمز أدناه لمزيد من المعلومات العملية في ماك 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 البنية تحتوي على كافة المعلومات حول process.such كما معرف العملية (PID)،  مجموعة عملية، ووضع عملية وغيرها.

معظم هذه المعلومات يمكن أن تكون حصلت من GetProcessInformation().

بالمناسبة لماذا الظاهري أساليب وظائف عودة processwide المعلومات ؟

هذا هو الكربون فقط و لا تعمل مع الكاكاو

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top