Universidad de Costa Rica

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

CI-0122 Sistemas Operativos

Proyectos

CI0122 / Proyectos / Proyecto-01


/**
  *  Ejemplo base para el problema de la ronda o papa caliente
  *
  *  CI-0122 Sistemas Operativos
  *  Fecha: 2026/Ago/12
  *
 **/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/wait.h>
#include <unistd.h>
#include <time.h>
#include <stdbool.h>

#define MaxParticipantes 10

// Variable global para el número de participantes
int participantes = MaxParticipantes;

/**
  *  Estructura para el paso de mensajes entre procesos
 **/
struct RondaPapa {
   long mtype;
   // otros elementos a definir por el estudiante
};


/**
  *  Aplica las reglas de Collatz al valor de la papa
  *
 **/
int cambiarPapa( int papa ) {

   if ( 1 == (papa & 0x1) ) {		// papa es impar
            papa = (papa << 1) + papa + 1;	// papa = papa * 2 + papa + 1
         } else {
            papa >>= 1;			// n = n / 2, utiliza corrimiento a la d
erecha, una posicion
         }

   return papa;

}


/**
  *   Código para cada participante
  *   Debe cambiar el valor de la papa y determinar si explotó
 **/
int participante( int id ) {

   _exit( 0 );	// Everything OK

}


/**
  *   Código para el invasor
  *   Manda mensajes al azar a los participantes de la ronda
  *
 **/
int invasor( int id ) {

   _exit( 0 );	// Everything OK

}


int main( int argc, char ** argv ) {
   int buzon, id, i, j, resultado;

   if ( argc > 1 ) {
      participantes = atoi( argv[ 1 ] );
   }
   if ( participantes <= 0 ) {
      participantes = MaxParticipantes;
   }

   srandom( getpid() );

   printf( "Creando una ronda de %d participantes\n", participantes );
   for ( i = 1; i <= participantes; i++ ) {
      if ( ! fork() ) {
         participante( i );
      }
   }

// El programa principal decidirá cual es el primer participante en arrancar y e
l valor inicial de la papa

// Creación del proceso invasor
   if ( ! fork() ) {
      invasor( i );
   }

// Espera que los participantes finalicen
   for ( i = 1; i <= participantes; i++ ) {
      j = wait( &resultado );
   }
   
   j = wait( &resultado );  // Espera por el invador

}