#include "Semaphore.h" #include #include #include #include #include #include #include #include #define N 10 void Derecho( int ); void Izquierdo( int ); Semaphore puente; // Inicializado en 1 struct Compartidos { int cont; int tipo; }; typedef struct Compartidos Compartir; Compartir * pComp; int id = 0; int main(){ int i = 0; // Creacion de las variables compartidas id = shmget( 0xABCDEF, sizeof( Compartir ), 0600 | IPC_CREAT ); if ( -1 == id ) { perror( "main" ); exit( 0 ); } pComp = ( Compartir * ) shmat( id, NULL, 0 ); srand( time( NULL ) ); // Genera una nueva semilla para los aleatorios while( i++ < N ) { int r = rand(); //printf( "rand = %d\n", r ); if ( ! fork() ) { // Es el hijo if ( r % 2 ) { printf( "Se creo un carro de la derecha [%d]\n", i ); Derecho( i ); } else { printf( "Se creo un carro de la izquierda [%d]\n", i ); Izquierdo( i ); } } } i = 0; int k, n; while ( i < N ) { //printf("Esperando por proceso %d \n", i ); n = wait( &k ); i++; }; printf( "Destruyendo los recursos de memoria compartida\n"); shmdt( pComp ); shmctl( id, IPC_RMID, NULL ); } // main void entrar( int, int ); void salir( int ); void Derecho( int i ){ entrar( 1, i ); printf( "Carro [%d] de la derecha cruzando el puente\n", i ); int r = rand() % 7; //printf( "rand = %d\n", r ); sleep( r ); printf( "Carro [%d] de la derecha saliendo del puente\n", i ); salir( i ); } void Izquierdo( int i ){ entrar( 2, i ); printf( "Carro [%d] de la izquierda cruzando el puente\n", i ); int r = rand() % 7; //printf( "rand = %d\n", r ); for ( ; r > 0; r-- ) { sleep( 1 ); } printf( "Carro [%d] de la izquierda saliendo del puente\n", i ); salir( i ); } void entrar( int t, int i ) { //printf( "Carro [%d] entrar cont = %d \n", i, pComp->cont ); //printf( "Carro [%d] entrar tipo = %d \n", i, pComp->tipo ); if ( pComp->cont == 0 || ( pComp->tipo != t && pComp->tipo != 0 ) ) { puente.Wait(); pComp->tipo = t; } pComp->cont++; //printf( "Carro [%d] entrar cont = %d \n", i, pComp->cont ); //printf( "Carro [%d] entrar tipo = %d \n", i, pComp->tipo ); } void salir( int i ) { pComp->cont--; printf( "Carro [%d] salir cont = %d \n", i, pComp->cont ); if ( pComp->cont == 0 ) { puente.Signal(); } _exit( i ); // Finalizar el proceso }