int sem_create(int val)
Essa função cria um semáforo com valor inicial val e retorna um identificador do novo semáforo.
Caso não seja possível criar o novo semáforo, a função retorna -1. Um retorno de -1 que um limite do sistema foi atingido (valores possíveis para errno nesse caso são ENOMEM, ENOSPC e ERANGE).
int sem_p(int semid)
Essa função decrementa o valor do semáforo semid, se esse valor for positivo, ou deixa o processo que a chama bloqueado na fila desse semáforo em caso contrário.
Um retorno de -1 indica erro (valores possíveis para errno nesse caso são EACCES, EIDRM, EINVAL e ERANGE).
int sem_v(int semid)
Essa função desbloqueia o primeiro processo da fila do semáforo semid, se houver algum processo nessa fila, ou incrementa o valor do semáforo em caso contrário.
Um retorno de -1 indica erro (valores possíveis para errno nesse caso são EACCES, EIDRM, EINVAL e ERANGE).
int sem_destroy(int semid)
Essa função destrói o semáforo semid, liberando os recursos alocados para ele no sistema operacional.
Um retorno de -1 indica erro (valores possíveis para errno nesse caso são EACCES, EIDRM, EINVAL, EPERM e ERANGE).
Essa biblioteca deve ser programada como um arquivo C independente, semaf.c, com os nomes visíveis externamente declarados em um arquivo semaf.h.
A implementação da biblioteca deve se basear nas funções semget, semop e similares, definidas pelo UNIX SV e disponíveis no Linux.
Usando a biblioteca descrita no ítem anterior, escreva um programa que modele o problema dos leitores e escritores dado na seção 2.3.2 do livro texto. Cada grupo pode escolher uma estrutura própria para seu programa, mas uma forma é usar um processo inicial que cria semáforos e áreas de memória compartilhadas e depois cria l processos leitores e e processos escritores (onde l e e são parâmetros da execução do programa). Cada um desses leitores e escritores fica em um loop onde repetidamente "pensa" durante algum tempo e solicita a operação correspondente.
A solução apresentada para o problema deve evitar starvation tanto de leitores como de escritores.
Crie funções pre_ler, pos_ler, pre_escrever e pos_escrever, que encapsulem todos os acessos a semáforos. As funções pre_ler e pre_escrever só devem retornar quando a operação correspondente puder prosseguir.
Para criar variáveis compartilhadas entre os diversos processos, utilize a função mmap.
Deve ser possível acompanhar o que está acontecendo com os diversos processos através da saída na tela. Além do mais, o programa deve "estimular" as situações de competição entre os processos. Isso quer dizer que você deve forçar cada processo a passar um tempo razoável pensando e um tempo razoável lendo ou escrevendo.