У меня довольно странная картина с синхронизацией модуля апача и своего сервера. На freebsd 5.4 запущен сервер, который при запуске инициализирует именнованный семафор и пишет в shared memory, модуль в апаче читает из shared memory
Если одновременно обращается к апачу только один клиент — всё нормально, но если много — sem_post иногда выдает ошибку EOVERFLOW, но освобождает семафор не увеличив его значение. Таким образом при количестве параллельных запросов >100 — меньше чем за минуту семафор приобретает отрицательное значение.
Не именнованных семафоров или разделяемых мьютексов — в freebsd 5.4 просто нет.
static int handler(request_rec *r) {
sem_t * sem = sem_open(SEMAPHORE, O_RDWR, 0777, 1); if(sem == SEM_FAILED) { log.Write(INFO, "sem_failed"); }
if(sem_wait(sem) == 0) { int val;
sem_getvalue(sem, &val); log.Write(INFO, "pid :%d, sem:-%d, max: %d", getpid(), val, SEM_VALUE_MAX);
if(sem_post(sem) != 0) { log.Write(INFO, "pid :%d, sem_post failed(%s)", getpid(), strerror(errno)); }
sem_getvalue(sem, &val); log.Write(INFO, "pid :%d, sem:+%d, max: %d", getpid(), val, SEM_VALUE_MAX);
sem_close(sem); }
ap_set_content_length(r, 0); ap_send_http_header(r);
return OK; }
Что делать, пока не знаю