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

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


  Mostrar Temas
Páginas: [1]
1  Programación / Programación C/C++ / Manejo de Señales en Linux(resuelto) en: 17 Agosto 2010, 00:15 am
Hola todo el mundo,
me he estado machacando buscando información sobre señales por google, pero lo que encuentro esta siempre a medias y no me explica como usar las señales y sus funcione.

Basicamente lo que me gustaria saber es que hacen y como se usan ciertas señales en c.
La funciones que tengo que usar son:
1-sigqueue (no me queda claro para que sirve la variable sig).
2-sigaction ( he leido que se pueden enviar datos con esta, aunque tampoco entiendo como)
3-sigwaitinfo(entiendo que es para esperar la señal pero la variables nose como se usan).
4-sigemptyset ( Para que sirven los sets?)
5-sigaddset
6-sigprocmask (Para que sirven la mascaras?)

También he visto que para usar ciertas variables de las funciones se han de declarar estructuras he inicializar no se que cosas.
Llevo toda la tarde leyendo paginas con ejemplos raros que no hacen nada y no encuentro nada que tenga una función util o que explique como se usa de verdad cada función. Espero que alguien tenga un momento para explicarme como funcionan, aunque sean algunas, o por lo menos recomendarme alguna página donde tengan información sobre como se usan.

Para lo que necesito estas funciones es para comunicar dos procesos, el main con un hijo creado con fork y ejecutando execlp para ejecutar al hijo. Solo necesito enviar una variable al otro proceso y matarlo cuando transcurra un tiempo.

Espero que alguién me pueda echar un cable, si hace falta mas información estare pendiente del post así que diganme y lo cuelgo cuanto antes.

Un saludo
2  Programación / Programación C/C++ / 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.  
3  Programación / Programación C/C++ / Pregunta sobre pid_t fork(); y el hijo creado. en: 29 Abril 2010, 16:12 pm
Hola todo el mundo, hace siglos que no me pasaba por aquí. En todo caso a sido en el primer foro que he pensado :D.

Bueno os cuento, mi duda es: si yo creo un hijo en linux con pid_t fork(); y este es creado dentro de un bucle, el también ejecutara el bucle o saldra de él??. La duda viene a raiz de que yo quiero que salga directamente o se me fastidia el invento :D.

Os copio el código que sera más comprensible supongo.
Citar
//DATOS ADICIONALES
N_MAX=15
numero es cada cuanto se genera un hijo
tiempo_max es lo que duerme el hijo

      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(); <-Creo el hijo, va a salir o va a comprobar el while?????
         
      }
      pid_h=getpid();
      if(pid_h==0)      //Solo si es hijo.
      {
         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();



Cualquier cosa que se os ocurra sera de gran ayuda.

Un saludo
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines