Foros del Web » Programación para mayores de 30 ;) » Programación General »

arbol de procesos

Estas en el tema de arbol de procesos en el foro de Programación General en Foros del Web. 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/ ...
  #1 (permalink)  
Antiguo 29/08/2003, 08:59
 
Fecha de Ingreso: agosto-2003
Mensajes: 12
Antigüedad: 20 años, 7 meses
Puntos: 0
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...
  #2 (permalink)  
Antiguo 29/08/2003, 15:13
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 meses
Puntos: 1
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.
  #3 (permalink)  
Antiguo 31/08/2003, 14:34
 
Fecha de Ingreso: agosto-2003
Mensajes: 12
Antigüedad: 20 años, 7 meses
Puntos: 0
resp

Lo voy a hacer en c
  #4 (permalink)  
Antiguo 31/08/2003, 22:15
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 meses
Puntos: 1
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.
  #5 (permalink)  
Antiguo 01/09/2003, 12:18
 
Fecha de Ingreso: agosto-2003
Mensajes: 12
Antigüedad: 20 años, 7 meses
Puntos: 0
ok!

vale, esto me va a ayudar...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:16.