Autor
|
Tema: Anillo de procesos circulares (Leído 5,117 veces)
|
smasher666
Desconectado
Mensajes: 76
|
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
|
|
|
En línea
|
|
|
|
biribau
Desconectado
Mensajes: 181
|
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] int main() { while(num--) { //num = numero de procesos pipe(mipipe); if(pid = fork()) { //hijo read(mipipe[0], &ini, sizeof(int)); //leemos del pipe del padre ini++; //procesamos } else { //padre write(mipipe[1], &ini, sizeof(int)); //escribimos en el pipe del hijo break; //acabamos la iteración } } }
[/spoiler] Faltaría cerrar los pipes si quieres pa hacerlo bien
|
|
|
En línea
|
|
|
|
smasher666
Desconectado
Mensajes: 76
|
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
|
|
|
En línea
|
|
|
|
biribau
Desconectado
Mensajes: 181
|
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 pipe(primera_pipe); write(primera_pipe[1], &ini, sizeof(int)); mipipe[0] = primera_pipe[0]; mipid = getpid(); while(num--) { pipe(pipe_hijo); if(pid = fork()) { mipipe[0] = pipe_hijo[0]; mipid = pid; } else { mipipe[1] = pipe_hijo[1]; while(1) { read(mipipe[0], &ini, sizeof(int)); printf("Leido %d en el proceso %d\n", ini , mipid ); ini++; write(mipipe[1], &ini, sizeof(int)); } } } mipipe[1] = primera_pipe[1]; while(1) { read(mipipe[0], &ini, sizeof(int)); printf("Leido %d en el proceso %d\n", ini , mipid ); ini++; write(mipipe[1], &ini, sizeof(int)); }
|
|
« Última modificación: 10 Mayo 2010, 19:14 pm por biribau »
|
En línea
|
|
|
|
biribau
Desconectado
Mensajes: 181
|
di a modificar en lugar de editar
|
|
|
En línea
|
|
|
|
smasher666
Desconectado
Mensajes: 76
|
gracias biribau, ha sido de mucha ayuda enserio, ya esta todo resuelto
|
|
|
En línea
|
|
|
|
smasher666
Desconectado
Mensajes: 76
|
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??
|
|
|
En línea
|
|
|
|
|
|