/** Programa de ejemplo de semáforos Permite interactuar con un conjunto de semáforos desde la línea de comandos **/ #include #include #include #include #include #include #include #define IPC_WAIT 0 #define CLAVE 42 union senum { int val; }; int main(int argc, char *argv[]) { int numsem; int semid; int r; // Indice del semŽáforo introducido por teclado int semindx; // Valor a sumar introducido por teclado int valor; // Operaciones con semŽáforos struct sembuf op; union senum extra; int monitor = 0; key_t clave; // Comprobar lŽínea de comandos numsem = 2; if (argc != 2) { printf("Uso: %s [] \n", argv[0]); printf("Uso: %s -m \n", argv[0]); printf("Numero de semŽáforos no indicado. Valor por defecto 2.\n"); printf(" -m Monitoriza el grupo de semáforos cada 4 seg.\n\n\n"); } else { if (strcmp("-m", argv[1]) !=0) { numsem = atoi(argv[1]); printf("Creando %i semaforos.\n", numsem); } else { monitor = 1; printf("Monitorizando.\n"); } } // Crear el grupo de semáforos clave = ftok("./scon.c", CLAVE); if (clave == -1) { perror("Error calculando clave del grupo de semáforos."); return -1; } // Si no existe lo crea, pero si ya existe utiliza el existente semid = semget(clave, numsem, IPC_CREAT | S_IRUSR | S_IWUSR); if (semid == -1) { perror("Error creando grupo - "); printf("Llave: %i\nSemaforos: %i\n", clave, numsem); return -1; } // Comprobamos si hay que monitorizar if (monitor == 1) { int c; int v; while(1) { sleep(4); for (c = 0; c < numsem; c++) { v = semctl(semid, c, GETVAL); printf("Semaforo: %i Valor %i |", c, v); } printf("\n"); } exit(0); } printf("Utilizando %i semáforos.\n", numsem); printf("Semáforos incializados a 0.\n"); semindx = 0; // Realizar operaciones do { printf("[Indice semáforo - Negativo terminar] >> "); scanf("%i", &semindx); printf("[Valor a añadir - + sube / - baja] >> "); scanf("%i", &valor); if (semindx > -1) { op.sem_num = semindx; op.sem_op = valor; op.sem_flg = IPC_WAIT; r = semop(semid, &op, 1); if ( r == -1) perror("Error en la operaciŽón. "); } } while(semindx > -1); printf("Destruyendo grupo de semáforos.\n"); r = semctl(semid, 0, IPC_RMID); if (r == -1) { perror("Error destruyedo grupo."); } else { printf("Grupo destruido.\n"); } return 0; }