Entrada de datos desde consola y validación.[Segmentation fault](Resuelto)

Iniciado por Tha_Traker, 12 Mayo 2010, 17:36 PM

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

Tha_Traker

Hola todo el mundo, llevo rato intentado hacer una practica estupida pero soy incapaza de realizarla de forma que funcione correctamente.
Mi principal problema es que tengo que implementarlo para linux y la entrada de datos es por main, o sea usando ./sim.exe "datos".
Se me compila perfectamente, pero al quere ejecutarlo me tira de error de segmentación.

Sospecho que el problema es la validación de la variable tiempo, o su extracción de la cadena, pero ya no se como modificar el código para que corra correctamente.

Se que pido mucho ya que es un coñazo mirar el código de otra persona e intentar entenderlo, pero lo he blindado con comentarios espero que eso ayuda.

Si se os ocurre cualquier cosa, os lo agradecería mil veces.


/***********************************************
Nombre: Simulador
Descripción: Primera parte de la creación de un simulador
de sistema operativo RR.
Fecha:13-01-09
Autor:Bruno Kröller da Silva
************************************************/

// Cabecera de librerías
#include <stdio.h> // Uso de printf,...
#include <stdlib.h> //Uso de atoi,...
#include <unistd.h> //Uso de waitpid,...
#include <sys/types.h> // Uso de rand,...
#include <string.h> // Uso de

//VARIABLES GLOBALES
#define N_MAX 15
#define T_MAX 30
#define T_MIN 5
//FUNCIONES
int hijos(int n_maximo,int quantum,int tiempo);



// Función main que recive parametros de entrada
int main (int argc, char *argv[])
{

// Variables de entorno.
int resultado; // 0 error 1 correcto
int tiempo;
int n_maximo;
int quantum;

//Valores predefinidos de las variables.
n_maximo=5;
quantum=80;
resultado=0;
/*
Controlamos que el número de argumentos sea correcto, en caso contrario
no empezamos a ejecutar las funciones principales.
*/
if(argc==1 || argc==3 || argc==5 || argc>6)
{

printf("\t\n Error, el formato es n p m q t");


}
else
{
/*
Si entran dos argumentos, nombre + tiempo
*/


if(argc==2)
{
tiempo=atoi(argv[2]);

if(1<=tiempo<=120)
{
resultado=1;
}


}
/*
Si entran 4 argumentos, nombre+ numero+ p + tiempo o nombre+ quantum+ q + tiempo
*/
else if(argc==4)
{
tiempo=atoi(argv[4]);
if(*argv[2]=='p' && 1<=tiempo<=120)
{
n_maximo=atoi(argv[1]);
resultado=1;
}
if(*argv[2]=='q' && 1<=tiempo<=120)
{
quantum=atoi(argv[1]);
resultado=1;
}


}
/*
Si entran6argumentos, nombre+ numero+ p+ quantum+ q + tiempo
*/
else if(argc==6)
{
tiempo=atoi(argv[6]);

if(*argv[2]=='p' && *argv[4]=='q' && 1<=tiempo<=120)
{

n_maximo=atoi(argv[1]);
quantum=atoi(argv[3]);
resultado=1;

}

}
// SAlIDA DEl PROGRAMA
if(resultado==1)
{
printf("\t\n Simulador: ");
printf("\t\n       Numero maximo de programas: %d ",n_maximo);
printf("\t\n       Quantum : %d",quantum);
printf("\t\n       Tiempo de ejecución: %d ",tiempo);
}
else
{
printf("\t\n Error al introducir los parametros:");
printf("\t\n [numero_prog] [p] [quantum] [q] [tiempo] ");
}

}

return 0;
}
int hijos(int n_maximo,int quantum,int tiempo)
{
int error; // 1 correcto, 0 error.
pid_t pid_h; // Variable donde almacenaremos el pid del hijo
int numero;
int i;
int tiempo_max;
//INICIALIZACIÓN DE VALORES
i=0;
error=1;

/*
LANZAMIENTO DEL SISTEMA OPERATIVO
*/
//Creamos un hijo
pid_t fork();
//Pedimos que nos diga su pid
pid_h=getpid();
//Comprobamos que el hijo se ha creado
if(pid_h==-1)
{
error=0;
}
else
{
//Ejecutado por el padre
if(pid_h!=0)
{
waitpid(pid_h,NULL,0);
}
//Ejecutado por el hijo
else
{
//Ejecutar el S.O.

//Aquí termina el hijo
exit(0);
}
}
/*
LANZAMIENTO DE LA TEMPORIZACIÓN.
*/
//Creamos un hijo
pid_t fork();
//Pedimos que nos diga su pid
pid_h=getpid();
//Comprobamos que el hijo se ha creado
if(pid_h==-1)
{
error=0;
}
else
{
//Ejecutado por el padre
if(pid_h!=0)
{
waitpid(pid_h,NULL,0);
}
//Ejecutado por el hijo
else
{
sleep(tiempo);
printf("\t\n Temporizador: Finalizado el tiempo de simulación ");
//Aquí termina el hijo
exit(0);
}
}
/*
LANZAMIENTO DE LA TEMPORIZACIÓN.
*/
//CREARCIÓN DE LOS 10 HIJOS

while(i<10)
{

srand(time(0));
//Generamos un numero no mayor que N_MAX
//Le sumamos 1 para que empiece en 1.
numero=1+rand()%(N_MAX);
//Generamos el tiempo de espera de cada hijo.
//Crea números en un intervalo de 5 a 30.
tiempo_max=5+rand()%21;
//Tiempo de espera para crear el siguiente hijo.
sleep(numero);
//CREAR HIJO
pid_t fork();

}
pid_h=getpid();
if(pid_h==0)
{
sleep(tiempo_max);
printf("\n\t Simulador: Lanzando programa- Tiempo ejecución %d ",tiempo_max);
exit(0);
}
//El padre espera a que todos los hijos mueran.
wait();

return(error);
}



/*
CHULETA DE VARIABLES

Valores mínimos y máximos de:
 mínimo  máximo
Tiempo : 1 120
Quantum : 20 200
Programas : 1 5

numero esta entre [1,30]






*/



biribau

Podrías poner la entrada con que falla, y la salida que te da antes del seg fault, sólo por comodidad así la gente no tiene que compilarlo que es más coñazo aún.

biribau

Bueno, falla por el control de los args, argv[2] es 0 cuando argc=2, deberías usar argv[1]. Deberías aprender gdb, lo encontré en 2 minutos eso teniendo en cuenta que hace bastante tiempo que no lo uso  ;)

Tha_Traker

#3
Vale eres el puto amo!
Me acabo de bajar dos IDE el KDevelop 4 y Anjuta IDE, los voy a probar ahora a ver que tal me va.
Mucha gracias tio, me has alegrado el día :D

Edito:

Me da que le queda un buen trabajo, porque lo que es funcionar no funciona del todo bien XD. En todo caso visto que estoy cogiendo los valores de sitios erroneos pues tendre más cuidado.

Por cierto si alguien, sabe manejar el asunto del fork() no vendría nada mal un par de consejos :)

biribau

Me alegro  ;D, hace falta que comente que todos los argv los tienes desplazados uno de más?(igual que ese caso en concreto pero con argv[3] ,4 etc) no, no?  ;)

Tha_Traker

Ya, si me he fijado que estan pinchados, no se en que estaría pensando al ponerlos. Encima llevo algo de tiempo haciendo la practica y como la dejo todo el rato. Nunca me acuerdo de lo que he hecho, encima tenía 3 copias y ya ni se cual es cual XD.

Gracias a tu tiempo ya lo veo más claro, menos mal que te has dado cuenta tú porque yo me hubiese tirado 3 días frustado.

Luego le dedico algo de tiempo que ahorame estoy peleando con una de arboles que es para mañana y las funciones me las da predefinidas.


Muchas gracias otra vez :)