elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C][?] Listar procesos en GNU/Linux
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C][?] Listar procesos en GNU/Linux  (Leído 1,879 veces)
AleBallesta

Desconectado Desconectado

Mensajes: 65



Ver Perfil
[C][?] Listar procesos en GNU/Linux
« 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.


En línea

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


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [C][?] Listar procesos en GNU/Linux
« Respuesta #1 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.


En línea

AleBallesta

Desconectado Desconectado

Mensajes: 65



Ver Perfil
Re: [C][?] Listar procesos en GNU/Linux
« Respuesta #2 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.
En línea

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


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [C][?] Listar procesos en GNU/Linux
« Respuesta #3 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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Listar procesos y realizar cosas con los procesos
Programación Visual Basic
sebas369 2 3,388 Último mensaje 14 Julio 2006, 16:08 pm
por sebas369
[VB.NET] Listar procesos activos en un Listbox.
.NET (C#, VB.NET, ASP)
kub0x 2 5,111 Último mensaje 26 Agosto 2011, 04:09 am
por kub0x
Listar Procesos
Programación Visual Basic
calk9 4 2,822 Último mensaje 20 Diciembre 2011, 00:52 am
por calk9
Listar puertos en uso por procesos
Programación Visual Basic
vvictoristudio 2 2,126 Último mensaje 18 Diciembre 2013, 10:34 am
por Mad Antrax
Listar procesos en listview.
.NET (C#, VB.NET, ASP)
nolasco281 4 3,087 Último mensaje 20 Junio 2015, 09:28 am
por nolasco281
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines