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 H( int );
void O( int );
Semaphore sO; // Inicializado en 1
Semaphore sH; // Inicializado en 1
struct Compartidos {
int nO;
int nH;
};
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 atomo de oxigeno [%d]\n", i );
O( i );
} else {
printf( "Se creo un atomo de hidrogeno [%d]\n", i );
H( 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 O( int i ){
if ( pComp->nH > 1 ) {
printf( "Molecula de agua creada por un O [%d] \n", i );
sH.V();
sH.V();
pComp->nH -= 2;
} else {
pComp->nO++;
sO.P();
}
}
void H( int i ){
if ( ( pComp->nH > 0) && (pComp->nO > 0) ) {
printf( "Molecula de agua creada por un H [%d] \n", i );
sH.V();
sO.V();
pComp->nH --;
pComp->nO --;
} else {
pComp->nH++;
sH.P();
}
}