2011-11-19 24 views
5

¿Puedo crear asignaciones de archivos en procfs para reflejar el estado interno de mi programa?Exportar el estado del programa a procfs?

Por ejemplo,

main.c: 

char *message; 

... 

asumir el PID es 1200, es posible crear un archivo/proc/1200/Variables/mensaje transitoria, que reflejará la variable mensaje?

Supongo que necesito trabajar con los procesos, ya que hay /proc/.../{net, fd, task, etc.}, ¿dónde debería comenzar si quiero agregar otras variables/sección en los proc fs?

Respuesta

1

Usted no puede menos que usted está escribiendo un módulo del núcleo

4

no hay herramientas para hacer lo que quiere lograr.

hay algunas cosas que están cerca - gdb(1) sabe cómo introspect programas que se ejecutan y muestran valores de algunas variables (no todas las variables sobrevivir compilación - cuando la depuración -g indicador de la ayuda gdb(1) descubrir qué optimizaciones pueden tener hecho a tu programa).

El proyecto FUSE hace posible que los programas de espacio de usuario proporcionen un sistema de archivos a otros procesos a través del kernel. Puede usar FUSE directamente para exportar las variables seleccionadas de su programa o puede intentar algo significativamente más ambicioso y escribir herramientas para encapsular las capacidades de introspección de gdb(1) con las capacidades de publicación de FUSE y proporcionar este servicio para el mundo.

También puede utilizar el 9p desde dentro de sus programas; es similar en espíritu a FUSE, permitiendo que los programas proporcionen interfaces para su funcionalidad a través de las interfaces del sistema de archivos. (Puede verlo en uso en el wmii window manager, donde es posible una sorprendente cantidad de control del administrador de ventanas a través de las interfaces del sistema de archivos, lo que permite una fácil programación usando el lenguaje que desee). Podría, de nuevo, integrar esto con la introspección de gdb(1) habilidades para tratar de proporcionar esto.

Espero que tal proyecto sea digno de un proyecto de último año o proyecto de posgrado, algo que no se lograría rápidamente.

3

En general, no puede hacerlo solo desde el espacio de usuario. procfs es el núcleo que le informa su estado de proceso. Entonces, si DESEA hacer algo como esto,

a) tiene que crear un módulo kernel que le permita comunicar el contenido b) desencadenar esa recuperación de contenido mediante una señal de algún tipo.

Por lo tanto, si REALMENTE desea hacer esto. Sugeriría la ruta siguiente:

1) Escriba un módulo del núcleo que pueda comunicar el estado del programa. Vamos a llamarlo kpsmod para nuestra discusión.

2) Hacer que se comunique con el espacio de usuario hacer que se comunique con el proceso del usuario a través de algún mecanismo (digamos enlace de red) para iniciar algún proceso de registro, que registre las direcciones de las variables. El programa de espacio de usuario le dice al módulo que está interesado en "exportarse" en una señal (digamos SIGHUP o SIGUSR1); hacer esto programable también Pase el nombre, la dirección y los tamaños para leer (con información de tipo si es necesario). Si la variable está en la pila, debe ser rechazada.Solo deben permitirse símbolos accesibles globalmente para esto (por simplicidad)

3) Incluso puede pensar en acceder a la pila de ptrace para el proceso en el momento de procesar la variable en particular.

4), entonces el módulo del núcleo debe crear un directorio/proc/kpsmod // * vars para cada variable y cuando la variable se lee

5) en leer la descarga del contenido de la memoria a través de proc (potencialmente formateado)

y listo :-) tiene el efecto deseado.

3

En lugar de usar /proc, puede usar un conducto con nombre.

Crea un fifo usando mkfifo, y haz que tu programa lo abra para escritura. Ya sea en un subproceso dedicado o de forma asíncrona, su programa generará texto cuando alguien ejecute cat your-pipe en el intérprete de comandos. cat abre la tubería con nombre para la lectura, por supuesto.

Esto esencialmente imita la interfaz cat /proc/...., pero en lugar de tener un módulo kernel implementar la generación de texto, tiene un programa que lo implementa.

Cuestiones relacionadas