Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: smasher666 en 10 Mayo 2010, 15:00 pm



Título: Anillo de procesos circulares
Publicado por: smasher666 en 10 Mayo 2010, 15:00 pm
Hola, estoy haciendo los "deberes " de la universidad, me piden hacer un anillo de procesos utilizando fork, el problema viene en que no tengo muy claro como hacerlo, de momento tengo hecho un bucle donde hacemos fork a un proceso para irlo duplicando , antes del primer fork, creamos una pipe donde el padre cerrara la entradas y el hijo la salida, para cerrar el circulo, creamos un pipe secundario que se ira arrastrando hacta la ultima iteracion, el problema viene que no se acavarlos de conectar, no se si una vez hecho el fork, cerrar la entrada del pipe, y crear uno nuevo o como hacerlo, solo es esa duda, no pido que me hagais el ejercicio hombre que si no no aprendo.

pd: He buscado en google, y en el buscador de el foro, he buscado hasta debajo de una col.

gracias por adelantado

pdd: antes de que lo pongais vosotros: http://lmgtfy.com/?q=ring+of+n+process (http://lmgtfy.com/?q=ring+of+n+process)


Título: Re: Anillo de procesos circulares
Publicado por: biribau en 10 Mayo 2010, 17:27 pm
Hay que hacer 2 cosas, leer del pipe con el padre y escribir en el pipe del hijo, pero podemos utilizar sólo una variable pipe, ponemos un while de procesos, en el padre terminamos con break y escribimos en el pipe del hijo, en el proceso hijo leemos del pipe, procesamos y seguimos iterando, al iterar se machaca el pipe haciendo que sea del nuevo hijo, para una entrada entera:
[spoiler]
Código
  1. int main() {
  2. while(num--) { //num = numero de procesos
  3. pipe(mipipe);
  4. if(pid = fork()) { //hijo
  5. read(mipipe[0], &ini, sizeof(int)); //leemos del pipe del padre
  6. printf("Leido %d\n", ini);
  7. ini++; //procesamos
  8. }
  9. else { //padre
  10. write(mipipe[1], &ini, sizeof(int)); //escribimos en el pipe del hijo
  11. break; //acabamos la iteración
  12. }
  13. }
  14. }
  15.  
[/spoiler]
Faltaría cerrar los pipes si quieres pa hacerlo bien


Título: Re: Anillo de procesos circulares
Publicado por: smasher666 en 10 Mayo 2010, 18:26 pm
Gracias por la repsuesta, no era bien bien lo que necesitava, pero por algo se empieza, de todas formas creo que y alo tengo, posteare la solucion cuando lo tenga, merci


Título: Re: Anillo de procesos circulares
Publicado por: biribau en 10 Mayo 2010, 19:11 pm
Perdón, no había leído bien xD
Me ha costado, pero se hace muy bien si haces un diagrama de como van forkeando los procesos, y las pipes que se crean y como se conectan
Esto circula con un entero que van incrementando cada uno, el primero se lo inyecta a sí mismo el entero
Código
  1.        pipe(primera_pipe);
  2. write(primera_pipe[1], &ini, sizeof(int));
  3. mipipe[0] = primera_pipe[0];
  4. mipid = getpid();
  5. while(num--) {
  6. pipe(pipe_hijo);
  7. if(pid = fork()) {
  8. mipipe[0] = pipe_hijo[0];
  9. mipid = pid;
  10. } else {
  11. mipipe[1] = pipe_hijo[1];
  12. while(1) {
  13. read(mipipe[0], &ini, sizeof(int));
  14. printf("Leido %d en el proceso %d\n", ini, mipid);
  15. ini++;
  16. write(mipipe[1], &ini, sizeof(int));
  17. }
  18. }
  19. }
  20. mipipe[1] = primera_pipe[1];
  21. while(1) {
  22. read(mipipe[0], &ini, sizeof(int));
  23. printf("Leido %d en el proceso %d\n", ini, mipid);
  24. ini++;
  25. write(mipipe[1], &ini, sizeof(int));
  26. }
  27.  


Título: Re: Anillo de procesos circulares
Publicado por: biribau en 10 Mayo 2010, 19:13 pm
:-[ di a modificar en lugar de editar


Título: Re: Anillo de procesos circulares
Publicado por: smasher666 en 11 Mayo 2010, 11:23 am
gracias biribau, ha sido de mucha ayuda enserio, ya esta todo resuelto


Título: Re: Anillo de procesos circulares
Publicado por: smasher666 en 11 Mayo 2010, 15:08 pm
bueno, tengo otro pequeño problema, modificando un poco el codigo que me has proporcionado, he abierto antes de hacer el for principal , un archivo del cual quiero que cada proceso cuando tenga el testigo , lea un caracter, de tal forma que hago fopen("entrada.txt","r"); y luego hago fscanf.. el problema es que solo lee el primer proceso, es decir, el primer proceso lee el primer caracter pero el resto lee caracteres vacios, porque puede ser??