Neste post, apresentamos algumas (sensíveis) restrições acerca do uso de semáforos em sistemas Darwin.
O padrão POSIX inclui especificações para semáforos nomeados e não-nomeados.
Para a nossa finalidade , semáforos não-nomeados (unnamed semaphores) seriam suficientes. Entretato, apenas o padrão nomeado (named semaphores) está disponível no Darwin. Neste caso, podemos criar e finalizar um semáforo da seguinte forma:
#include <semaphore.h>O sútil problema ocorre quando o processo do programa é killed durante execução, situação na qual os semáforos não são fechados e unlinked apropriadamente. Como o kernel do Darwin (aparentemente) não limpa estes semáforos imediatamente, uma solução é necessária para evitar que subsequentes execuções do programa utilizem o antigo semáforo (residual).
sem_t * sem_open(const char *name, int oflag, mode_t mode, unsigned int value);
int sem_close(sem_t *sem);
int sem_unlink(const char *name);
Isto pode ocorrer caso novas chamadas de sem_open() utilizem a mesma string 'name'.
A solução proposta é gerar uma (longa) string aleatória cada vez que se deseje um novo semáforo. Assim em posts anteriores, as declarações tomam a seguinte forma:
Usar semáforos no Mac OS X passa então a não mais ser uma experiência frustrante!
sem_t * sem_open(rand_str(const char *sem_name,int strlength),
O_CREAT ,0, unsigned int sem_init_value);
No comments:
Post a Comment