Código:
if(padre) { for(i=0; i<HIJOS; i++) { if(p[i]) { for(;;) { funcion(); } } } }
| |||
Concurrencia Hola, he creado tres procesos hijos utilizando fork. Guardo los pid de los procesos hijos en un array llamado p. Los procesos hijos deben ejecutar la misma función de forma infinita. Solo consigo que el primer hijo ejecute la función de forma infinita. ¿Cómo podría hacer que los demás hijos también la ejecutasen? Gracias de antemano.
Código:
if(padre) { for(i=0; i<HIJOS; i++) { if(p[i]) { for(;;) { funcion(); } } } } |
| |||
Respuesta: Concurrencia yo ahí no veo ningún fork y dado que no soy mago ni vidente no puedo adivinar el diseño de tu algoritmo... ¿tanto cuesta poner ejemplos completos?
__________________ La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo. |
| |||
Respuesta: Concurrencia Este es el código con fork:
Código:
for(i=0; i<HIJOS && padre; i++) { if((padre = fork()) == -1) { exit(EXIT_FAILURE); } else { p[i] = padre; } } if(padre) { for(i=0; i<HIJOS; i++) { if(p[i]) { for(;;) { funcion(); } } } } else { } |
| |||
Respuesta: Concurrencia
Código C:
Ver original Pregunta: ¿Cuántos hilos habrá al terminar ese bucle? Respuesta: 4 Explicación:
Por otro lado, llamar a fork hace que el hijo tenga una copia de la memoria del padre y a partir de ese momento cada uno usa su propia memoria... almacenar en un arreglo los id no parece una buena idea porque cada proceso va a almacenar un arreglo diferente. Si el número de hijos es una constante puedes probar algo tal que:
Código C:
Ver original También puedes embeber el código en un bucle... pero teniendo cuidado de crear procesos únicamente desde el padre:
Código C:
Ver original Un saludo.
__________________ La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo. Última edición por eferion; 18/04/2016 a las 11:25 |
| |||
Respuesta: Concurrencia Ahora se crean bien los procesos hijos. El problema es que al ejecutar la función de forma infinita, el primer proceso entra en el bucle infinito y los demás procesos mueren. Así lo tengo ahora:
Código:
padre = getpid(); for(i=0; i<HIJOS; i++) { if(!fork()) { break; } } if(getppid() == padre) // Hijos. { for(;;) { funcion(); } } |
| |||
Respuesta: Concurrencia Si yo ejecuto esto:
Código C:
Ver original Obtengo esto:
Código BASH:
Ver original Es decir, en el if únicamente entran los procesos hijos. Salvo que estés creando otros procesos antes de llegar aquí no se me ocurre cómo te puede estar fallando.
__________________ La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo. |
| |||
Respuesta: Concurrencia Sí, el problema es cuando ejecuto la función con el bucle infinito. Es que esa función deben ejecutarla todos los procesos a la vez de forma infinita, pero solo me deja que la ejecute el primero. |
| |||
Respuesta: Concurrencia ¿Es esto acaso una práctica de clase o tu proyecto tiene una utilidad real? Si es lo segundo posiblemente sea mejor pasar de fork y usar hilos. En cualquier caso has de tener en cuenta las limitaciones del SO que uses. También has de tener en cuenta que no es lo mismo que el hilo o proceso se ejecute a nivel de SO que a nivel de aplicación. En el segundo caso un hilo que entre en un bucle sin fin puede dejar bloqueados a todos los demás.
__________________ La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo. |
| |||
Respuesta: Concurrencia Es para una práctica de clase. ¿Habría otra forma de que se ejecutase todo el rato una función sin utilizar un bucle infinito? Para que no se bloqueasen los demás procesos. |
| |||
Respuesta: Concurrencia Cita: Una forma que suelo usar aunque supongo que no será lo más correcto es poner dentro de ese bucle un Sleep (100) por ejemplo. Eso hace que se pause el bucle 100 milisegundos y consigues que no se bloquee.También depende mucho de lo que haga la función que esta dentro del bucle ya que si lo que esperas en el bucle es algún mensaje o evento quizás podrías usar hilos y esperar la respuesta lo que dejaría al hilo que espera la respuesta congelado a la espera de dicha respuesta. Con eso tampoco dejarías congelado el proceso. También podrías usar una función callback y desde la función que se ejecuta en tu caso envías un mensaje al proceso y lo gestionas sin más. Pipes, memoria compartida sockets y no se que más. |
Etiquetas: |