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