Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: AleBallesta en 11 Septiembre 2015, 20:50 pm



Título: [C][?] Listar procesos en GNU/Linux
Publicado por: AleBallesta en 11 Septiembre 2015, 20:50 pm
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:

Código:

/* ---- 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.


Título: Re: [C][?] Listar procesos en GNU/Linux
Publicado por: ivancea96 en 11 Septiembre 2015, 20:54 pm
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.


Título: Re: [C][?] Listar procesos en GNU/Linux
Publicado por: AleBallesta en 11 Septiembre 2015, 21:01 pm
La violacion de segmento esta en la linea 43:

Código:
		strcpy(filestr, strcat("/proc/", istr));

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

Gracias por responder.


Título: Re: [C][?] Listar procesos en GNU/Linux
Publicado por: ivancea96 en 11 Septiembre 2015, 21:37 pm
strcat concatena a la cadena A la cadena B.

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

Código
  1. char filestr[20] = "/proc/";
  2. strcpy(filestr, istr);

Y revisa de paso el resto de concatenaciones.