#include <stdio.h>
#include <zconf.h>

#define NBRESSOURCE 4

typedef int Semaphore[2];
char buffer[1];

/* initialise le tube sem avec n caractères quelconques */
void initSem(Semaphore sem, int n) {
    printf("Initialisation de la semaphore : ");
    char string[n];
    for (int i = 0; i < n; ++i) {
        string[i] = (char) ('a' + i);
    }
    string[n] = '\0';
    printf("%s (%i ressources)\n", string, NBRESSOURCE);
    pipe(sem);
    write(sem[1], string, (size_t) n); // write to output
}

/* lit un caractère dans sem */
void P(Semaphore sem) {
    read(sem[0], buffer, sizeof(char)); // process bloquant si read renvoi 0
    printf("Call P[rendre]() : Prendre une resource\n");
}

/* écrit un caractère dans sem */
void V(Semaphore sem) {
    printf("Call V[as-y]() : Libère une ressource\n");
    char my_char = 'a';
    write(sem[1], &my_char, sizeof(char));
}

int main() {
    Semaphore sem;
    initSem(sem, NBRESSOURCE);
    pid_t pid;
    switch (pid = fork()) {
        case -1:
            perror("fork()");
        case 0 :
            printf("--- Fils : %d ---\n", getpid());
            P(sem);
            P(sem);
            P(sem);
            P(sem);
            P(sem);
            break;
        default:
            printf("--- Père : %d ---\n", getpid());
            printf("Père s'endort 10 seconde avant de libérer une ressource\n");
            sleep(10);
            V(sem);
    }
}