<html>
<head>
<style>
P
{
margin:0px;
padding:0px
}
body
{
FONT-SIZE: 10pt;
FONT-FAMILY:Tahoma
}
</style>
</head>
<body>
<BR>Bien , no se si habras visto o escuchado sobre un algoritmo llamado "cena de los filosofos",<BR>
bien es una parecico lo que buco se llama ""lectores y escritores". Gracias<BR>
 <BR>
aca dejo un codigo que encontre en internet, pero la verdad es que no tiene algunos errores:<BR>
 <BR>
/***************************************************************************/<BR>/**  Tema    : Implementacion do 1eiro problema de Lectores Escritores    **/<BR>/**            empregando Semaforos.                                      **/<BR>/**                                                                       **/<BR>/**  Data    : 4-Xunho-1997                                               **/<BR>/***************************************************************************/<BR><BR>#include <sys/types.h><BR>#include <sys/stat.h><BR>#include <fcntl.h><BR>#include <unistd.h><BR>#include <stdio.h><BR><BR>typedef struct<BR>         {<BR>          char *Mutex;<BR>          char *Delay;<BR>          char *Valor;<BR>          char *Despertar;<BR>         }Semaforo;<BR><BR><BR><BR><BR>Semaforo Smut;<BR>Semaforo Swrt;<BR>char *FichInfo,*DatosPila,*CimaPila;<BR>char *Sbinario;<BR><BR><BR><BR>int Ler_Disco(NomFich,Posicion)<BR>char *NomFich;<BR>int Posicion;<BR>{<BR><BR>int df,Valor;<BR>df=open(NomFich,O_CREAT|O_RDONLY,0600);<BR>lseek(df,Posicion*sizeof(int),SEEK_SET);<BR>read(df,&Valor,sizeof(int));<BR>close(df);<BR>/*printf("\n Lin o valor: %d  da Posicion %d ",Valor,Posicion);<BR>printf("do ficheiro %s ",NomFich);*/<BR>return Valor;<BR><BR>}<BR><BR>void Grabar_Disco(NomFich,Posicion,Dato)<BR>char *NomFich;<BR>int Posicion;<BR>int Dato;<BR>{<BR>int df,Tino;<BR><BR> df=open(NomFich,O_CREAT|O_WRONLY,0600);<BR> lseek(df,Posicion*sizeof(int),SEEK_SET);<BR> write(df,&Dato,sizeof(int));<BR>/* printf("\n Grabei o valor %d na Posicion %d ",Dato,Posicion);<BR> printf(" do ficheiro %s ",NomFich);*/<BR> close(df);<BR><BR>}<BR><BR>/* Implementacion de operacions para Semaforos binarios */<BR><BR>void Pb(Nome)<BR>char *Nome;<BR>{<BR><BR>   int df;<BR>   while ((df=open(Nome,O_CREAT|O_EXCL,0600))==-1);<BR>   close(df);<BR><BR>}<BR><BR>void Vb(Nome)<BR>char *Nome;<BR>{<BR> unlink(Nome);<BR>}<BR><BR><BR>/* Funcion para Insertar Dato na Pila */<BR>void InsPila(Dato)<BR>int Dato;<BR>{<BR>int Cima;<BR>Cima=Ler_Disco(CimaPila,0);<BR>Cima=Cima+1;<BR>Grabar_Disco(DatosPila,Cima,Dato);<BR>Grabar_Disco(CimaPila,0,Cima);<BR>/*printf("\n Inserto na Pila o valor %d na posicion %d",Dato,Cima);*/<BR>}<BR><BR><BR>/* Ler e Suprimir un dato da Pila */<BR>int SuprPila(void)<BR>{<BR>int Cima,Dato;<BR><BR>Pb(Sbinario);<BR>Cima=Ler_Disco(CimaPila,0);<BR>Dato=Ler_Disco(DatosPila,Cima);<BR>if (Cima==-1) printf("\n Pila Vacia ");<BR> else<BR>   {<BR>    Grabar_Disco(CimaPila,0,Cima-1);<BR>   }<BR>Vb(Sbinario);<BR>return Dato;<BR><BR>}<BR><BR><BR>/* Implementacion de Kearns de semaforos Xerales a partir de Sem. binarios */<BR>void P(s)  Semaforo s;  {<BR> int df,Valor;<BR> int Despertar;<BR> Pb(s.Mutex);<BR> Valor=Ler_Disco(s.Valor,0);<BR> Valor=Valor+1;<BR> Grabar_Disco(s.Valor,0,Valor);<BR> if (Valor<0)<BR>    {<BR>      Vb(s.Mutex);<BR>      Pb(s.Delay);<BR>      Pb(s.Mutex);<BR>      Despertar=Ler_Disco(s.Despertar,0);<BR>      Despertar=Despertar-1;<BR>      Grabar_Disco(s.Despertar,0,Despertar);<BR>      if (Despertar>0) Vb(s.Delay);<BR><BR>     }<BR>  Vb(s.Mutex);<BR>}<BR><BR><BR><BR>void V(s)  Semaforo s;  {<BR>  int df,Valor,Despertar;<BR>  Pb(s.Mutex);<BR>  Valor=Ler_Disco(s.Valor,0);<BR>  Valor=Valor+1;<BR>  Grabar_Disco(s.Valor,0,Valor);<BR>  if (Valor<=0)<BR>      {<BR>        Despertar=Ler_Disco(s.Despertar,0);<BR>         Despertar=Despertar+1;<BR>        Grabar_Disco(s.Despertar,0,Despertar);<BR><BR>      Vb(s.Delay);<BR>      }<BR>  Vb(s.Mutex);<BR>}<BR><BR>/* Primeiro Problema dos Lectores Escritores */<BR><BR>void Lector(Sem,Swrt,Num)<BR>Semaforo Sem;Semaforo Swrt;<BR>int Num;<BR>{<BR> int ReadCounter,df,DatoPila;<BR> printf("\n O lector %d quere ler un libro ... \n",Num);<BR> fflush(stdout);<BR> P(Sem);<BR> ReadCounter=Ler_Disco(FichInfo,0);<BR> ReadCounter=ReadCounter+1;<BR> Grabar_Disco(FichInfo,0,ReadCounter);<BR> if (ReadCounter==1)  P(Swrt);<BR> V(Sem);<BR>    printf("\n O Lector %d Consigue Ler o libro da Sabiduria\n",Num);<BR>    fflush(stdout);<BR>    DatoPila=SuprPila();<BR><BR> P(Sem);<BR> ReadCounter=Ler_Disco(FichInfo,0);<BR> ReadCounter=ReadCounter-1;<BR> Grabar_Disco(FichInfo,0,ReadCounter);<BR> if (ReadCounter==0) V(Swrt);<BR> V(Sem);<BR><BR>}<BR><BR><BR>void Escritor(Swrt,Num)<BR>Semaforo Swrt;<BR>int Num;<BR>{<BR>sleep(2);<BR>printf("\n O Escritor %d intenta que lle publiquen un libro ",Num);<BR>P(Swrt);<BR><BR>  printf("\n O Escritor %d consigue publicar un libro ",Num);<BR>  InsPila(Num);<BR><BR>V(Swrt);<BR><BR>}<BR><BR><BR>main ()<BR><BR>{<BR><BR><BR>/* Inicializo Datos */<BR> int ReadCounter,df;<BR> int Valor,Despertar,i;<BR> Sbinario="SemPila";<BR> CimaPila="CimaPila";<BR> DatosPila="DatosPila";<BR> FichInfo="FichInfo";<BR> Smut.Mutex="SmutMutex";<BR> Smut.Delay="SmutDelay";<BR> Smut.Valor="SmutValor";<BR> Smut.Despertar="SmutDespertar";<BR> Valor=1;<BR> Despertar=0;<BR> Swrt.Mutex="SwrtMutex";<BR> Swrt.Delay="SwrtDelay";<BR> Swrt.Valor="SwrtValor";<BR> Swrt.Despertar="SwrtDespertar";<BR> ReadCounter=0;<BR> Grabar_Disco(Smut.Valor,0,Valor);<BR> Grabar_Disco(Smut.Despertar,0,Despertar);<BR> Grabar_Disco(FichInfo,0,ReadCounter);<BR> Grabar_Disco(Swrt.Valor,0,Valor);<BR> Grabar_Disco(Swrt.Despertar,0,Despertar);<BR> unlink(Smut.Mutex);<BR> unlink(Swrt.Mutex);<BR> unlink(DatosPila);<BR> unlink(CimaPila);<BR> unlink(Sbinario);<BR> df=open(Smut.Delay,O_CREAT|O_WRONLY,0600);<BR> close(df);<BR> df=open(Swrt.Delay,O_CREAT|O_WRONLY,0600);<BR> close(df);<BR> Grabar_Disco(CimaPila,0,-1);<BR> for (i=1;i<12;i++) InsPila(i);<BR>/* Fin Inicializacion de Datos */<BR>/* Creo 20 procesos concurrentes : 10 Lectores e 10 Escritores */<BR> if (fork()==0)<BR>  Lector(Smut,Swrt,1);<BR> else<BR>  if (fork()==0)<BR>   Lector(Smut,Swrt,2);<BR>  else<BR>   if (fork()==0)<BR>    Escritor(Swrt,1);<BR>   else<BR>    if (fork()==0)<BR>     Lector(Smut,Swrt,3);<BR>    else<BR>     if (fork()==0)<BR>      Escritor(Swrt,2);<BR>     else<BR>      if (fork()==0)<BR>       Escritor(Swrt,3);<BR>      else<BR>       if (fork()==0)<BR>        Lector(Smut,Swrt,4);<BR>       else<BR>        if (fork()==0)<BR>         Lector(Smut,Swrt,5);<BR>        else<BR>         if (fork()==0)<BR>          Lector(Smut,Swrt,6);<BR>         else<BR>          if (fork()==0)<BR>           Escritor(Swrt,4);<BR>          else<BR>           if (fork()==0)<BR>            Lector(Smut,Swrt,7);<BR>           else<BR>            if (fork()==0)<BR>             Lector(Smut,Swrt,8);<BR>            else<BR>             if (fork()==0)<BR>              Escritor(Swrt,5);<BR>             else<BR>              if (fork()==0)<BR>               Escritor(Swrt,6);<BR>              else<BR>               if (fork()==0)<BR>                Escritor(Swrt,7);<BR>               else<BR>                if (fork()==0)<BR>                 Escritor(Swrt,8);<BR>                else<BR>                 if (fork()==0)<BR>                  Escritor(Swrt,9);<BR>                 else<BR>                  if (fork()==0)<BR>                   Escritor(Swrt,10);<BR>                  else<BR>                   if (fork()==0)<BR>                    Lector(Smut,Swrt,9);<BR>                   else<BR>                    Lector(Smut,Swrt,10);<BR><BR><BR>}<BR><BR><BR><BR><BR><BR><br /><hr />Consigue el nuevo Windows Live Messenger <a href='http://get.live.com/messenger/overview' target='_new'>Pruébalo</a></body>
</html>