[C][?] Listar procesos en GNU/Linux

Iniciado por AleBallesta, 11 Septiembre 2015, 20:50 PM

0 Miembros y 1 Visitante están viendo este tema.

AleBallesta

Hola, estoy creando un programa en C que brinde datos sobre el estado actual de un SO GNU/Linux, solo con objetivo educativo  ;) . Tengo un problema con la parte que imprime una lista de los procesos en ejecucion. Ya elimine todos los errores y advertencias de compilacion.
Aca va el codigo:



/* ---- HEADERS ---- */

# include <stdio.h>
# include <string.h>
# include <unistd.h>
# include <stdlib.h>



/* ---- CONSTANTS AND VARIABLES ---- */

// Max PID
int max_pid()
{

FILE *mp = fopen("/proc/sys/kernel/pid_max", "r");
char max_p[10];
fgets(max_p, 10, mp);
int max_pid = atoi(max_p);
fclose(mp);
return max_pid;

}




/* ----SUBPROCESSES ---- */

// Process Listing
int ps()
{

int MAX_PID = max_pid();
int i;
for (i=0; i <= MAX_PID; i++)
{

char istr[10];
sprintf(istr, "%d", i);
char filestr[20];
strcpy(filestr, strcat("/proc/", istr));

char filestr1[30];
strcpy(filestr1, strcat(filestr, "/cmdline"));
FILE *process1 = fopen(filestr1, "r");
char prout1[100];
fread(prout1, sizeof(char), 100, process1);
printf("%s\n", prout1);
fclose(process1);

char filestr2[30];
strcpy(filestr2, strcat(filestr, "/fd"));
FILE *process2 = fopen(filestr2, "r");
char prout2[100];
fread(prout2, sizeof(char), 100, process2);
printf("%s\n", prout2);
fclose(process2);

char filestr3[30];
strcpy(filestr1, strcat(filestr, "/status"));
FILE *process3 = fopen(filestr3, "r");
char prout3[100];
fread(prout3, sizeof(char), 100, process3);
printf("%s\n\n\n\n\n", prout3);
fclose(process3);

}

return 0;

}





int main()
{

ps();

return 0;

}




Cuando ejecuto el programa, sale "Violacion de Segmento". Tenia entendido que los archivos que intento leer pueden ser leidos como cualquier otro archivo (busque informacion sobre el tema antes de empezar). Agradezco cualquier aporte, solo quiero aprender.
La cantidad de combinaciones de particulas definen la cantidad de universos posibles. A su vez, una combinacion determnada, solo da lugar a una posible cadena de hechos relacionados por causa y efecto.
LA CASUALIDAD NO EXISTE, SOLO LA CAUSALIDAD.

ivancea96

Busca la línea donde está la violación de segmento. Esto lo haces colocando pausas, o colocando salidas por pantalla, hasta aislar el problema. Una vez aislada la linea, mira qué variables utiliza y busca sus definiciones. Mira que estén todas bien inicializadas (en caso de que sea necesario).

Si no encuentras nada, di qué linea es.

AleBallesta

La violacion de segmento esta en la linea 43:


strcpy(filestr, strcat("/proc/", istr));


Como puede suceder eso en una operacion tan simple como en una union de cadenas?

Gracias por responder.
La cantidad de combinaciones de particulas definen la cantidad de universos posibles. A su vez, una combinacion determnada, solo da lugar a una posible cadena de hechos relacionados por causa y efecto.
LA CASUALIDAD NO EXISTE, SOLO LA CAUSALIDAD.

ivancea96

strcat concatena a la cadena A la cadena B.

En esa operación, tu cadena A es una constante.
Lo mejor es que hagas:

char filestr[20] = "/proc/";
strcpy(filestr, istr);


Y revisa de paso el resto de concatenaciones.