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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Entrada de datos desde consola y validación.[Segmentation fault](Resuelto)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Entrada de datos desde consola y validación.[Segmentation fault](Resuelto)  (Leído 4,390 veces)
Tha_Traker

Desconectado Desconectado

Mensajes: 28



Ver Perfil
Entrada de datos desde consola y validación.[Segmentation fault](Resuelto)
« en: 12 Mayo 2010, 17:36 pm »

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.

Código
  1. /***********************************************
  2. Nombre: Simulador
  3. Descripción: Primera parte de la creación de un simulador
  4. de sistema operativo RR.
  5. Fecha:13-01-09
  6. Autor:Bruno Kröller da Silva
  7. ************************************************/
  8.  
  9. // Cabecera de librerías
  10. #include <stdio.h> // Uso de printf,...
  11. #include <stdlib.h> //Uso de atoi,...
  12. #include <unistd.h> //Uso de waitpid,...
  13. #include <sys/types.h> // Uso de rand,...
  14. #include <string.h> // Uso de
  15.  
  16. //VARIABLES GLOBALES
  17. #define N_MAX 15
  18. #define T_MAX 30
  19. #define T_MIN 5
  20. //FUNCIONES
  21. int hijos(int n_maximo,int quantum,int tiempo);
  22.  
  23.  
  24.  
  25. // Función main que recive parametros de entrada
  26. int main (int argc, char *argv[])
  27. {
  28.  
  29. // Variables de entorno.
  30. int resultado; // 0 error 1 correcto
  31. int tiempo;
  32. int n_maximo;
  33. int quantum;
  34.  
  35. //Valores predefinidos de las variables.
  36. n_maximo=5;
  37. quantum=80;
  38. resultado=0;
  39. /*
  40. Controlamos que el número de argumentos sea correcto, en caso contrario
  41. no empezamos a ejecutar las funciones principales.
  42. */
  43. if(argc==1 || argc==3 || argc==5 || argc>6)
  44. {
  45.  
  46. printf("\t\n Error, el formato es n p m q t");
  47.  
  48.  
  49. }
  50. else
  51. {
  52. /*
  53. Si entran dos argumentos, nombre + tiempo
  54. */
  55.  
  56.  
  57. if(argc==2)
  58. {
  59. tiempo=atoi(argv[2]);
  60.  
  61. if(1<=tiempo<=120)
  62. {
  63. resultado=1;
  64. }
  65.  
  66.  
  67. }
  68. /*
  69. Si entran 4 argumentos, nombre+ numero+ p + tiempo o nombre+ quantum+ q + tiempo
  70. */
  71. else if(argc==4)
  72. {
  73. tiempo=atoi(argv[4]);
  74. if(*argv[2]=='p' && 1<=tiempo<=120)
  75. {
  76. n_maximo=atoi(argv[1]);
  77. resultado=1;
  78. }
  79. if(*argv[2]=='q' && 1<=tiempo<=120)
  80. {
  81. quantum=atoi(argv[1]);
  82. resultado=1;
  83. }
  84.  
  85.  
  86. }
  87. /*
  88. Si entran6argumentos, nombre+ numero+ p+ quantum+ q + tiempo
  89. */
  90. else if(argc==6)
  91. {
  92. tiempo=atoi(argv[6]);
  93.  
  94. if(*argv[2]=='p' && *argv[4]=='q' && 1<=tiempo<=120)
  95. {
  96.  
  97. n_maximo=atoi(argv[1]);
  98. quantum=atoi(argv[3]);
  99. resultado=1;
  100.  
  101. }
  102.  
  103. }
  104. // SAlIDA DEl PROGRAMA
  105. if(resultado==1)
  106. {
  107. printf("\t\n Simulador: ");
  108. printf("\t\n       Numero maximo de programas: %d ",n_maximo);
  109. printf("\t\n       Quantum : %d",quantum);
  110. printf("\t\n       Tiempo de ejecución: %d ",tiempo);
  111. }
  112. else
  113. {
  114. printf("\t\n Error al introducir los parametros:");
  115. printf("\t\n [numero_prog] [p] [quantum] [q] [tiempo] ");
  116. }
  117.  
  118. }
  119.  
  120. return 0;
  121. }
  122. int hijos(int n_maximo,int quantum,int tiempo)
  123. {
  124. int error; // 1 correcto, 0 error.
  125. pid_t pid_h; // Variable donde almacenaremos el pid del hijo
  126. int numero;
  127. int i;
  128. int tiempo_max;
  129. //INICIALIZACIÓN DE VALORES
  130. i=0;
  131. error=1;
  132.  
  133. /*
  134. LANZAMIENTO DEL SISTEMA OPERATIVO
  135. */
  136. //Creamos un hijo
  137. pid_t fork();
  138. //Pedimos que nos diga su pid
  139. pid_h=getpid();
  140. //Comprobamos que el hijo se ha creado
  141. if(pid_h==-1)
  142. {
  143. error=0;
  144. }
  145. else
  146. {
  147. //Ejecutado por el padre
  148. if(pid_h!=0)
  149. {
  150. waitpid(pid_h,NULL,0);
  151. }
  152. //Ejecutado por el hijo
  153. else
  154. {
  155. //Ejecutar el S.O.
  156.  
  157. //Aquí termina el hijo
  158. exit(0);
  159. }
  160. }
  161. /*
  162. LANZAMIENTO DE LA TEMPORIZACIÓN.
  163. */
  164. //Creamos un hijo
  165. pid_t fork();
  166. //Pedimos que nos diga su pid
  167. pid_h=getpid();
  168. //Comprobamos que el hijo se ha creado
  169. if(pid_h==-1)
  170. {
  171. error=0;
  172. }
  173. else
  174. {
  175. //Ejecutado por el padre
  176. if(pid_h!=0)
  177. {
  178. waitpid(pid_h,NULL,0);
  179. }
  180. //Ejecutado por el hijo
  181. else
  182. {
  183. sleep(tiempo);
  184. printf("\t\n Temporizador: Finalizado el tiempo de simulación ");
  185. //Aquí termina el hijo
  186. exit(0);
  187. }
  188. }
  189. /*
  190. LANZAMIENTO DE LA TEMPORIZACIÓN.
  191. */
  192. //CREARCIÓN DE LOS 10 HIJOS
  193.  
  194. while(i<10)
  195. {
  196.  
  197. srand(time(0));
  198. //Generamos un numero no mayor que N_MAX
  199. //Le sumamos 1 para que empiece en 1.
  200. numero=1+rand()%(N_MAX);
  201. //Generamos el tiempo de espera de cada hijo.
  202. //Crea números en un intervalo de 5 a 30.
  203. tiempo_max=5+rand()%21;
  204. //Tiempo de espera para crear el siguiente hijo.
  205. sleep(numero);
  206. //CREAR HIJO
  207. pid_t fork();
  208.  
  209. }
  210. pid_h=getpid();
  211. if(pid_h==0)
  212. {
  213. sleep(tiempo_max);
  214. printf("\n\t Simulador: Lanzando programa- Tiempo ejecución %d ",tiempo_max);
  215. exit(0);
  216. }
  217. //El padre espera a que todos los hijos mueran.
  218. wait();
  219.  
  220. return(error);
  221. }
  222.  
  223.  
  224.  
  225. /*
  226. CHULETA DE VARIABLES
  227.  
  228. Valores mínimos y máximos de:
  229.  mínimo  máximo
  230. Tiempo : 1 120
  231. Quantum : 20 200
  232. Programas : 1 5
  233.  
  234. numero esta entre [1,30]
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241. */
  242.  
  243.  
  244.  


« Última modificación: 12 Mayo 2010, 19:43 pm por Tha_Traker » En línea

biribau

Desconectado Desconectado

Mensajes: 181


Ver Perfil
Re: Entrada de datos desde consola y validación.[Segmentation fault]
« Respuesta #1 en: 12 Mayo 2010, 17:43 pm »

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.


En línea

biribau

Desconectado Desconectado

Mensajes: 181


Ver Perfil
Re: Entrada de datos desde consola y validación.[Segmentation fault]
« Respuesta #2 en: 12 Mayo 2010, 17:50 pm »

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  ;)
En línea

Tha_Traker

Desconectado Desconectado

Mensajes: 28



Ver Perfil
Re: Entrada de datos desde consola y validación.[Segmentation fault]
« Respuesta #3 en: 12 Mayo 2010, 18:04 pm »

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 :)
« Última modificación: 12 Mayo 2010, 18:17 pm por Tha_Traker » En línea

biribau

Desconectado Desconectado

Mensajes: 181


Ver Perfil
Re: Entrada de datos desde consola y validación.[Segmentation fault]
« Respuesta #4 en: 12 Mayo 2010, 18:15 pm »

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?  ;)
En línea

Tha_Traker

Desconectado Desconectado

Mensajes: 28



Ver Perfil
Re: Entrada de datos desde consola y validación.[Segmentation fault]
« Respuesta #5 en: 12 Mayo 2010, 18:23 pm »

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 :)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines