#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include <semaphore.h>

#define PATH "./fichero_compartido"
#define SEM_NAME "/p_mutex"

int main(int argc, char *argv[]) {
    FILE *f;
    sem_t *semaphore;
    const char *msg = (argc > 1) ? argv[1] : "registro_por_defecto";

    // Crear o abrir el semaforo nominal POSIX (inicia en 1)
    semaphore = sem_open(SEM_NAME, O_CREAT, S_IRUSR | S_IWUSR, 1);
    if (semaphore == SEM_FAILED) {
        perror("Error al abrir sem_open");
        return 1;
    }

    // Bloquear el semaforo (entrar a seccion critica)
    sem_wait(semaphore);

    printf("Seccion critica ocupada por proceso %d.\n", getpid());
    printf("Comprueba que el semaforo esta activo (en Linux visible bajo /dev/shm).\n");
    printf("Pulsa [ENTER] para continuar...\n");
    getchar();

    f = fopen(PATH, "a");
    if (f != NULL) {
        fprintf(f, "Proceso %d: %s\n", getpid(), msg);
        fclose(f);
    } else {
        perror("Error al abrir fichero compartido");
    }

    // Desbloquear semaforo (salir de seccion critica)
    sem_post(semaphore);

    // Cerrar descriptor del semaforo en este proceso
    sem_close(semaphore);

    // Desvincular nombre del sistema (solo el ultimo proceso o limpieza)
    sem_unlink(SEM_NAME);

    printf("Proceso %d ha liberado el semaforo y finalizado.\n", getpid());
    return 0;
}
