Anillo de procesos circulares

Iniciado por smasher666, 10 Mayo 2010, 15:00 PM

0 Miembros y 2 Visitantes están viendo este tema.

smasher666

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

biribau

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
printf("Leido %d\n", ini);
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

smasher666

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

biribau

#3
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));
}

biribau

:-[ di a modificar en lugar de editar

smasher666

gracias biribau, ha sido de mucha ayuda enserio, ya esta todo resuelto

smasher666

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??