¿Cómo obtener información del proceso mediante programación en C / C ++ desde un sistema Solaris?

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

Pregunta

¿Existe una biblioteca C / C ++ y documentación sobre cómo recopilar información del sistema y el proceso en Solaris?

Aunque podría analizar las herramientas de línea de comandos, prefiero usar una biblioteca que facilite la tarea.

Gracias

Editar: se ha sugerido utilizar el directorio virtual / proc para recopilar información, sin embargo, no es mucho mejor que analizar las herramientas de línea de comandos, en el sentido de que necesitaré implementar algunas tipo de análisis personalizado para cada pieza de datos que necesito.

Estoy buscando algo similar a las bibliotecas de c para Windows o MacOS que proporciona esta información a través de una API de sistemas basados ??en c, sin embargo, no tengo suerte con Google.

¿Fue útil?

Solución

Puede obtener este tipo de información con kstat API .

man -s 3KSTAT  kstat

Puede ver cómo se usa en OpenSolaris vmstat y iostat .

Para obtener información sobre processus, miraría ps .

Otros consejos

Solaris tiene el / proc directorio virtual , que le permite recopilar todo tipo de información acerca de los procesos que utilizan las funciones de E / S del sistema de archivos.

Usaría el directorio virutal / proc como CrashWorks ha sugerido. He hecho esto en aux y linux. Una cosa a tener en cuenta es que cuando utilicé el directorio / proc en Linux, el formato de los archivos varió de un núcleo a otro.

No sé cómo es la situación en el lado de Solaris, pero esto podría significar que su solución no será portátil de una plataforma solaris a otra.

¿qué pasa con getrusage () ?

Definitivamente no soy un experto en el tema, pero hice algo muy similar para una tarea el semestre pasado cuando se nos pidió que tomáramos instantáneas de los procesos. Lamentablemente, este método requiere cavar en el núcleo, que probablemente no sea lo que desea hacer.

Encontré este artículo útil.

De todos modos, aquí hay algunos fragmentos.

 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);

La idea que necesita para bloquear algunas estructuras de datos o, a veces, el núcleo se bloqueará. " para_cada_proceso " es una macro definida en alguna parte, pero no recuerdo cómo funciona 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. 



  }


}

Algunos de mis compañeros de clase tomaron diferentes enfoques y se sumergieron en la fuente de la "ps" utilidad. Creo que estaba trabajando en Linux 2.6.18-92.1.13.e15. Descargo de responsabilidad: esto funcionó para mí, pero su kilometraje puede variar. Bien podría estar fuera de la pared y no quiero llevarte por la dirección equivocada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top