Universidad de Costa Rica

Escuela de Ciencias de la Computación e Informática

CI-0122 Sistemas operativos

Ejemplos

CI0122 / Ejemplos


#include "Semaphore.h"
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <wait.h>

#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

}