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;
struct Compartidos {
int cont;
int tipo;
};
typedef struct Compartidos Compartir;
Compartir * pComp;
int id = 0;
int main(){
int i = 0;
id = shmget( 0xABCDEF, sizeof( Compartir ), 0600 | IPC_CREAT );
if ( -1 == id ) {
perror( "main" );
exit( 0 );
}
pComp = ( Compartir * ) shmat( id, NULL, 0 );
srand( time( NULL ) );
while( i++ < N ) {
int r = rand();
if ( ! fork() ) {
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 ) {
n = wait( &k );
i++;
};
printf( "Destruyendo los recursos de memoria compartida\n");
shmdt( pComp );
shmctl( id, IPC_RMID, NULL );
}
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;
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;
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 ) {
if ( pComp->cont == 0 ||
( pComp->tipo != t && pComp->tipo != 0 ) ) {
puente.Wait();
pComp->tipo = t;
}
pComp->cont++;
}
void salir( int i ) {
pComp->cont--;
printf( "Carro [%d] salir cont = %d \n", i, pComp->cont );
if ( pComp->cont == 0 ) {
puente.Signal();
}
_exit( i );
}