/******************

  Progama ejemplo de diferentes funciones de semaforos 
  Prueba las funciones definidas en semop.h 


  Compilacion: cc semaf.c 

**********/


#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include "semop.h"

#define KEY_SEM1  IPC_PRIVATE    
#define KEY_SEM2  (key_t) 275463
#define KEY_SEM3  37416

main()
{
  
  int sema3, mutex, sema;     /* variables id de los semaforos */
  int i,n, res;               
  key_t llave;
  char *arch;
  char idkey;


  system("clear");
  printf("Programa de prueba funciones semaforos \n");

  /* obtencion de una llave IPC para crear semaforos */ 

  system("touch ./llave.key");
  arch ="llave.key";
  idkey = 'b';
  llave =ftok(arch, idkey);
  if (llave < 0) {
    printf("Error %d, en generacion llave con [%s] y %c\n", errno,arch,idkey); 
    exit(1);
  }
  printf("Se creo una llave \n");


  /* creacion directa arreglo semaforos de longitud 5 con permisos: 0666 */
  /* si se omite el |0666, despues no se puede leer              */

  if ((sema3 = semget(KEY_SEM3, 5, IPC_CREAT|0666 )) < 0) {
    printf("Error %d creacion directa semaforo \n",errno); 
    exit(1); 
  } 
  printf("Se creo sema3: semaforo con cinco elementos \n");


  /* ejemplo uso funcion make_semas para crear arreglo semaforos longitud 3 */
 
  if ((sema= make_semas(llave, 3)) < 0) {
    printf("Error %d creacion directa semaforo \n",errno); 
    exit(1); 
  } 
  printf("Se creo sema: semaforo con tres elementos \n");


  /* ejemplo uso funcion make_semas para crrar arreglo semaforos longitud 1 */

  if ((mutex = make_semas(KEY_SEM2, 1)) < 0) {
    printf("Error %d creacion directa semaforo \n",errno);  
    exit(1);
  }
  printf("Se creo mutex: semaforo con un solo elemento \n");


  /* impresi\'on de los valores de los semaforos: */

  printf("Impresion valores sema3: \n");
  for(i=0; i<3; i++)  {
    if ( (res = valsem_n(sema3,i)) < 0) {
      printf("Error %d lectura de sema3 \n",errno);  
      exit(1);
    }
    printf(" Valor sem[%d]:%d \n",i, res);   
  }
  printf("Valor semaforo mutex:%d\n", imp_semval(mutex));    

  /* asignando los valores de 1,2 y 3 al semaforo 0, 1 y 2,  */
  /* respectivamente, de sema3                                 */
  for(i=1; i<=3; i++)
     asig_val_sem(sema3,i-1,i);

  /* asignando el valor de 5 al semaforo mutex */
   asig_val_sem(mutex,0,5);

  /* impresi\'on de los valores de los semaforos: */
  printf("Impresion semaforos despues asignacion:\n");
  printf("Impresion valores sema3: \n");
  for(i=0; i<3; i++) 
    printf("   Valor sem[%d]:%d \n",i, valsem_n(sema3,i));   
  printf("Valor semaforo mutex:%d", imp_semval(mutex));    

  /* impresion de los semaforos existentes en ese momento */
  printf("\n\nSemaforos existentes:\n"); 
  system("ipcs -s");
  
  /*borrar los semaforos*/
   borra_sem(sema3);
   borra_sem(mutex);

  /* impresion de los semaforos */
  printf("\nSemaforos existentes despues borrar sema3 y mutex\n");
  system("ipcs -s");
}




