hola necesito hacer un arbol con los procesos en linux con llamadas a sistema, lo que pasa es que no puedo recorrer el fichero /proc/ y estoy pegado en eso.
ayuda porfa...
| |||
arbol de procesos hola necesito hacer un arbol con los procesos en linux con llamadas a sistema, lo que pasa es que no puedo recorrer el fichero /proc/ y estoy pegado en eso. ayuda porfa... |
| |||
Hola, Me imagino que lo que buscas es crear una aplicación que pueda recorrer recursivamente la estructura de archivos bajo el directorio /proc, y hacer algún procesamiento con los archivos encontrados, ¿no es así? ¿En qué lenguaje de programación piensas trabajar? Un cordial saludo. |
| |||
Muy bien, entonces se me ocurre algo como lo siguiente.
Código:
/*** Librerias estandar usadas ***/ #include <dirent.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> /*** Macros ***/ #define DIRECTORIO_INICIAL "/proc" /* Directorio en donde iniciar el * procesamiento */ /*** Prototipos ***/ void listar_directorio (const char *); /*** Funcion principal ***/ int main (void) { printf ("Listando el contenido del directorio `%s'.\n\n", DIRECTORIO_INICIAL); listar_directorio (DIRECTORIO_INICIAL); return 0; } /*** Funciones ***/ /* listar_directorio() * * Recibe el nombre de un directorio, e imprime, recursivamente, la * estructura de archivos bajo el directorio dado. */ void listar_directorio (const char *nombre_dir) { struct dirent *dir_info; struct stat stat_info; /* Informacion sobre cada nodo */ size_t tam_dir; /* Tamanyo del nombre del directorio * recibido */ size_t tam_nodo; /* Tamanyo reservado para los nombres * de los nodos */ char *nodo = NULL; DIR *dd; /* Descriptor de directorio */ char sim_bufer[NAME_MAX + 1]; /* Bufer para nombres de enlaces * simbolicos */ int n; /* Chequear si el directorio recibido es un enlace simbolico */ if (lstat (nombre_dir, &stat_info) == 0 && stat_info.st_mode & S_IFLNK){ n = readlink (nombre_dir, sim_bufer, NAME_MAX); sim_bufer[n] = '\0'; /* Imprimir enlace simbolico */ printf (" %s -> %s\n", nombre_dir, sim_bufer); return; } tam_dir = strlen (nombre_dir); dd = opendir (nombre_dir); if (! dd) { fprintf (stderr, " * Error leyendo informacion desde %s\n", nombre_dir); return; } while ((dir_info = readdir (dd))) { /* Saltar nodos que comiencen por `.' */ if (dir_info->d_name[0] == '.') continue; if (! nodo) { tam_nodo = strlen (dir_info->d_name) + tam_dir + 2; nodo = (char *) malloc (sizeof (char) * tam_nodo); } else if (strlen (dir_info->d_name) > tam_nodo - tam_dir - 2) { tam_nodo = strlen (dir_info->d_name) + tam_dir + 2; nodo = (char *) realloc (nodo, sizeof (char) * tam_nodo); } strcpy (nodo, nombre_dir); strcat (nodo, "/"); strcat (nodo, dir_info->d_name); if (stat (nodo, &stat_info) == 0) { if (stat_info.st_mode & S_IFDIR) listar_directorio (nodo); else if (stat_info.st_mode & S_IFREG) printf (" %s\n", nodo); } } if (nodo) free (nodo); } En este ejemplo tan solo se recorre recursivamente la estructura de archivos bajo `/proc' y se lista cada archivo encontrado. Quizás te sirva al menos como guía para el recorrido sobre el sistema de archivos en tu aplicación. Por supuesto, en caso de que necesites información sobre algunas de las funciones usadas en este ejemplo, te recomiendo que en primera instancia consultes los manuales de programación del sistema, los cuales, dicho sea de paso, fueron mi referencia mientras escribía este segmento de código. Por ejemplo, en este momento mi historial en el intérprete de comandos debe contener las siguientes líneas: man 3 opendir man 3 readdir man 2 stat :) Saludos. |