كيفية الحصول على معلومات عملية برمجيا في C/C++ من سولاريس النظام ؟

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

سؤال

هل هناك C/C++ المكتبة والتوثيق حول كيفية نظام جمع ومعالجة المعلومات على Solaris?

على الرغم من أنني يمكن أن تحليل أدوات سطر الأوامر ، أنا أفضل استخدام المكتبة التي تجعل هذه المهمة أسهل.

شكرا

تحرير: وقد اقترح استخدام /proc الدليل الظاهري في جمع المعلومات ، لكن ليست أفضل بكثير من تحليل أدوات سطر الأوامر ، بمعنى أنني سوف تحتاج إلى تنفيذ بعض نوع من العرف تحليل كل قطعة من المعلومات التي كنت بحاجة.

أنا أبحث عن شيء ما على غرار ج المكتبات ويندوز أو ماك التي توفر هذه المعلومات من خلال ج-النظم القائمة على API ، ومع ذلك أواجه أي حظ مع جوجل.

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

المحلول

يمكنك الحصول على هذا النوع من المعلومات kstat API.

man -s 3KSTAT  kstat

يمكنك أن ترى كيف يتم استخدامه في OpenSolaris vmstat و iostat المصدر.

للحصول على معلومات حول الناتئ, كنت أنظر ps.

نصائح أخرى

سولاريس لديه /proc الدليل الظاهري, مما يسمح لك لجمع كل أنواع المعلومات عن العمليات التي تستخدم نظام الملفات وظائف I/O.

أود أن استخدام /proc virutal dir كما CrashWorks اقترح.لقد فعلت هذا في كل aux و لينكس.شيء واحد أن نأخذ في الاعتبار عندما لم تستخدم /proc dir على لينكس شكل ملفات متنوعة من نواة إلى أخرى.

أنا لا أعرف ما هو الوضع على سولاريس الجانب ولكن هذا يمكن أن يعني أن الحل لن يكون المحمولة من سولاريس منصة إلى أخرى.

ماذا عن 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" الأداة المساعدة.أعتقد أن تعمل على لينكس 2.6.18-92.1.13.e15.تنويه:هذا العمل بالنسبة لي ولكن الأميال الخاص بك قد تختلف.أنا يمكن أن يكون جيدا جدا خارج الجدار و أنا لا أريد أن تقودك إلى أسفل الاتجاه الخاطئ.

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