procesos concurrentes

Iniciado por ferminta, 13 Enero 2012, 19:29 PM

0 Miembros y 1 Visitante están viendo este tema.

ferminta

tengo un Caso de procesos concurrentes que no logro ver donde falla:


Se trata de la realización de un programa en C llamado padre que deberá crear un proceso "hijo" el cual deberá calcular los 10 primeros números de la sucesión de Fibonacci e imprimirlos por salida estándar (formato " HIJO: fibonacci % N =%M\n "
donde %N y %M representan el índice y el valor del correspondiente número de la sucesión)

Mientras el "hijo" realiza el cálculo, el "padre" deberá esperar a que termine. Una vez haya terminado, el hijo comunicará al proceso "padre" la información necesaria para poder continuar con el cálculo de la sucesión. De esa manera el padre podrá continuar y calcular los siguientes 10 números de la sucesión e imprimirlos por salida estándar (formato " PADRE: fibonacci %N=%M\n"
donde %N y %M representan el índice y el valor del correspondiente número de la sucesión)
Se trata de que el  "padre" no deberá nunca calcular la sucesión desde el inicio.




Resuelvo el problema  creando un proceso hijo, realizando la llamada al sistema fork.
Después compruebo si estoy  en el proceso hijo, y entonces ejecuto diez iteraciones de la sucesión de Fibonacci :  if (fork()==0.....etc.., y voy pintando por pantalla los resultados

A partir de aquí debe continuar el proceso padre, después de que el hijo haga un exit al terminar el bucle:
Puntos:
1-       Escribo  un wait para que el padre espere a que termine el hijo.
2-        Antes de que el hijo haga el exit, paso al proceso padre los dos últimos valores que calculó el proceso hijo, para que el padre siga con la serie.

El punto dos al tratarse de dos procesos independientes (cada uno con su PID) ejecutándose de manera concurrente, utilizo de un mecanismo de comunicación entre procesos para pasar estas variables de un proceso a otro.
(paso los valores de la serie de Fibonacci t9 y t10 del hijo al padre (para que este último calcule el t11):

Después de calcular el hijo los valores de la serie y haberlos almacenado en un array 1..10, utilizo dos tuberías sin nombre,las abrire en el extremo de escritura y pasar los dos últimos valores del array, uno en cada tubería. El padre, después de que el hijo haga el exit, leerá las tuberías y con estos valores seguirá con la serie.


En código:

#define N=10
#include<stdio.h>
#define M
#include<unistd.h>
#include<stdlib.h>
#include<wait.h>

int main ()
{
int tabla[10];
int i,j;
int estadohijo;
int sig;
int mipipeone[2];
int mipipetwo[2];
int leido1,leido2;

pipe(mipipeone);
pipe(mipipetwo);
if(fork()==0)
{
printf("Proceso hijo/n");
printf("%d/n",0);
scanf("%d",& tabla[0]);
printf("%d/n",1);
scanf("%d",& tabla[1]);

for (i=2;i<=10;i++)
{
tabla=tabla[i-1] + tabla[i-2];
scanf("%d",tabla);
printf("%d", tabla);
}
write(mipipeone[1],tabla[9],1);
write(mipipetwo[1],tabla[10],1);
exit;
else
{
wait (& estadohijo);
printf ("Proceso Padre/n");
leido1=read(mipipeone[0],tabla[9],1);
leido2=read(mipipetwo[0],tabla[10],1);
sig=leido1+leido2;
scanf("%d",sig);
printf("%d",sig]);
while (j<M)
{
leido2=sig;
sig=sig+leido2;
scanf("%d",sig);
printf("%d",sig]);
}
   }

Xandrete

He respondido en tu otro post de Programacion en C/C++