sistema procesadores para llamadas dentro archivos administración c unix process minix

procesadores - Número de procesos en ejecución en un sistema Minix a partir del código C



minix 3 intel (8)

Mira esto: http://procps.sourceforge.net/

Tiene origen en una serie de pequeñas utilidades que hacen este tipo de cosas. Será una buena experiencia de aprendizaje :) y creo que PS está ahí como señaló pm100.

Por lo tanto, esto parecía simple al principio, pero después de rastrear Google y aquí, la respuesta no parece tan simple como pensé en un principio.

Básicamente, estoy editando un núcleo MINIX como parte de un curso práctico para mi sistema operativo, y tengo que agregar una pequeña función que escupe la cantidad de procesos en ejecución cuando se presiona una tecla de función en el servidor de información. He descubierto cómo integrar la funcionalidad para que todas las otras cosas funcionen, pero por mi vida, no puedo imaginar cómo hacer que el número actual de procesos que se ejecutan en el sistema se convierta en mi código C y en una variable para imprimir.

Primero pensé que habría un ingenioso Syscall como SYS_NUMPROCS o algo que devolvería el valor, pero no hubo suerte. Luego, traté de conectar la salida de un sistema ("ps -ax | wc -l") a un archivo y el archivo no se crearía. Intenté usar popen () y tampoco tuve suerte, incluso con una simple lectura "ls" en un búfer, simplemente bombardea el código y "bloquea" la ejecución del código, por lo que no hay salida.

Así que ahora estoy realmente perplejo, y cualquier ayuda sería increíble, porque en este punto he agotado todas las opciones obvias.

Las dos únicas cosas en las que puedo pensar ahora serían un bucle contando todos los procesos, pero primero tienes que llegar a la lista de procesos del sistema, y ​​he oído cosas vagas acerca de / proc / como directorio, pero no lo he hecho. Es una pista de cómo acceder / ejecutar a través de eso o cómo se vincularía para obtener la cantidad de procesos en primer lugar.

Gracias a stack (juego de palabras jajaja), chicos :)

Además, no he incluido el código explícitamente porque no he escrito nada aparte de la impresión básica para productos cosméticos, porque ninguna de las cosas que probé me dio alegría alguna: /

Editar notas: Chicos, esta es una edición del kernel. Estoy escribiendo la función para imprimir la información en un archivo C del sistema, luego recompilar el kernel y reiniciar el sistema para probar. Es un kernel de UNIX (MINIX), no un kernel de Linux, y no es un programa de modo de usuario.

Mi código para popen (), como algunos de ustedes solicitaron, es el siguiente:

public void cos_dmp(){ char buffer[512]; FILE * f; f = popen("ps -ax | wc -l","r"); fgets(buffer, sizeof(buffer),f); //buffer should now contain result of popen() printf(buffer); }

Esa es una versión un tanto pirateada de lo que recuerdo y mantenerlo muy simple y mostrarles a ustedes eso es lo que estaba tratando de hacer. Sin embargo, una vez más, debe haber una forma mejor de hacer esto aparte de llamar esencialmente a la salida de una llamada al sistema ().

Editar de nuevo: el código anterior funciona perfectamente desde un programa de usuario, pero no funcionará desde la función kernel. ¿Alguien tiene una idea de por qué?: /


Quizás podría mostrarnos el código que escribió para capturar el resultado del system("ps -ax | wc -l") , o el código que escribió para usar popen y podríamos ayudarlo a diagnosticar el problema con él.

De todos modos, la manera más eficiente en que puedo pensar para contar el número de procesos existentes (no el mismo en ejecución) en el sistema es opendir("/proc") y contar el número de entradas que son cadenas de dígitos decimales. Cada proceso en el sistema estará representado por un subdirectorio de / proc , nombrado después del número de identificación del proceso decimal de ese proceso.

Entonces, si encuentra "/ proc / 3432", por ejemplo, entonces sabrá que existe un proceso con un pid de "3432". Simplemente cuente la cantidad de subdirectorios que encuentra cuyos nombres son números decimales.

Suposiciones
  • Usted pregunta por Linux , no por MINIX .
  • Está escribiendo un programa en modo usuario, sin modificar el kernel.

Si está editando el kernel, la manera más eficiente de resolver este problema es mantener un conteo cada vez que se crea un proceso (es decir, una entrada task_struct) (y asegúrese de disminuir el recuento donde termina un proceso).

Siempre puede recorrer la lista de procesos en el kernel utilizando la macro incorporada (pero es caro, por lo que debe intentar evitarlo):

struct task_struct *p; unsigned int count = 0; for_each_process(task) { count++; }


intenta mirar para ver qué hace ps. Mira su código fuente; sabe cuántos procesos hay


struct kinfo kinfo; int nr_tasks, nr_procs; getsysinfo(PM_PROC_NR, SI_KINFO, &kinfo); nr_procs = kinfo.nr_pro;

Esto te dará la cantidad de procesos en ejecución


Así que he tenido el mismo problema y he encontrado una solución. (MINIX 3.1) dentro del método para contar los procesos use este código: (Esto es ANSI C)

Simplemente se ejecuta en la tabla de procesos y cuenta la cantidad de procesos.

Sé que este es un hilo viejo, pero podría ayudar a alguien en el futuro.

#include "../pm/mproc.h" /* inside function */ struct mproc *mp; int i, n=0; printf("Number of running processes:/n"); getsysinfo(PM_PROC_NR, SI_PROC_TAB, mproc); for (i = 0; i<NR_PROCS; i++) { mp = &mprocs[i]; if (mp->mp_pid == 0 && i != PM_PROCS_NR) continue; n++; } printf("%d", n); /* function end */



Tenía la misma tarea en mi universidad, así que publicaré mi solución si alguien la necesita en el futuro. Estoy usando Minix 3.3 y VMware Player para máquinas virtuales.
En el servidor pm en la ubicación / usr / src / minix / servers / pm, hay un archivo glo.h que contiene varias variables globales utilizadas por pm server. En ese archivo, afortunadamente, hay una variable llamada procs_in_use definida como EXTERN int procs_in_use;
Tan simple printf("%d/n",procs_in_use); desde una llamada al sistema mostrará la cantidad de procesos actuales en ejecución. Puede probar esto agregando la función fork() en su programa de espacio de usuario en el medio de un ciclo.

Una mención más: primera respuesta que dice

struct kinfo kinfo; int nr_tasks, nr_procs; getsysinfo(PM_PROC_NR, SI_KINFO, &kinfo); nr_procs = kinfo.nr_procs;

no funcionó para mí SI_KINFO ya no existe, por lo que debe usar SI_PROC_TABLE . También puede haber problemas con los permisos, por lo que no podrá llamar a esta función desde su llamada al sistema habitual. Hay una función alternativa sys_getkinfo(&kinfo) que se puede sys_getkinfo(&kinfo) desde su nueva llamada al sistema y que hará lo mismo que la anterior. El problema es que kinfo.nr_procs no devolverá el número de procesos actuales, sino el número máximo de procesos de usuario que pueden estar en el sistema operativo, que es 256 por defecto, y puede cambiarse manualmente en el archivo donde se define NR_PROCS. Por otro lado, kinfo.nr_tasks devolverá el número máximo de procesos del kernel que pueden ser retenidos por el sistema operativo, que es 5 por defecto.