Universidad de Costa Rica
Escuela de Ciencias de la Computación e Informática
CI-0122 Sistemas operativos
Ejemplos
|
|
CI0122 /
Ejemplos
|
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SIZE 10
#define KEY 0x123456
#define PERMS IPC_CREAT | 0600
struct misDatos {
int cin; // Input position in buffer
int cout; // Output position in buffer
int counter; // Items in buffer
char buffer[ SIZE ]; // buffer
};
int main( int argc, char ** argv ) {
int id;
struct misDatos * x;
int size = sizeof( struct misDatos );
srandom( time( NULL ) );
id = shmget( KEY, size, PERMS );
x = (struct misDatos *) shmat( id, NULL, 0 );
x->cin = 0;
x->cout = 0;
x->counter = 0;
if ( fork() ) {
consumer( x );
} else {
producer( x );
}
shmctl( id, IPC_RMID, NULL );
}
int producer( struct misDatos * p ) {
int i, j;
int t;
for ( i = 0; i < 23; i++ ) {
sleep( random() % 2 );
while ( p->counter >= SIZE ) {
printf( "productor esperando por espacio en el buffer ...\n" );
sleep( random() % 2 );
}
p->buffer[ p->cin++ ] = 'A' + i;
p->cin %= SIZE;
p->counter++;
printf( "item producido [%c] counter = %d \n", 'A' + i, p->counter );
}
exit( 0 );
}
int consumer( struct misDatos * c ) {
int i, j;
int t;
for ( i = 0; i < 23; i++ ) {
sleep( random() % 5 );
while ( c->counter <= 0 ) {
printf( "consumidor esperando por datos ...\n" );
}
printf( "Item consumido = %c \n", c->buffer[ c->cout++ ] );
c->cout %= SIZE;
c->counter--;
}
}