Делает ли связь / закрытие семафоров также инкремент в C - PullRequest
0 голосов
/ 13 января 2019

У меня есть многопроцессный проект.

Один сервер, который прослушивает и читает из кольцевого буфера, и несколько клиентов, которые записывают в кольцевой буфер.

У меня 3 семафора.

sfree для свободного в данный момент пространства, используется для используемого в настоящее время пространства и swacc для управления доступом к записи ( взаимное исключение для записи ).

Вот упрощенная версия сервера (не правильный код):

int shmfd = shm_open(SHM_NAME, O_RDWR | O_CREAT, 0600);
ftruncate(shmfd, sizeof(struct shm));
struct shm *shm;
shm = mmap(NULL, sizeof(*shm), PROT_READ | PROT_WRITE, MAP_SHARED, shmfd, 0);
sem_t *sfree = sem_open(SEM_FREE, O_CREAT | O_EXCL, 0600, MAX_DATA);
sem_t *sused = sem_open(SEM_USED, O_CREAT | O_EXCL, 0600, 0);
sem_t *swacc = sem_open(SEM_WACC, O_CREAT | O_EXCL, 0600, 1);

sem_wait(sused);
//read continuously
sem_post(sfree);

Клиент:

int shmfd = shm_open(SHM_NAME, O_RDWR | O_CREAT, 0600);
ftruncate(shmfd, sizeof(struct shm));
struct shm *shm;
shm = mmap(NULL, sizeof(*shm), PROT_READ | PROT_WRITE, MAP_SHARED, shmfd, 0);
sem_t *sfree = sem_open(SEM_FREE, 0);
sem_t *sused = sem_open(SEM_USED, 0);
sem_t *swacc = sem_open(SEM_WACC, 0);
//multiple writes obviously
sem_wait(sfree);
sem_wait(swacc);
//write
sem_post(swacc);
sem_post(sused);

Теперь мой вопрос: Что делать, если я прекращаю работу супервизора и освобождаю ресурсы следующим образом (устанавливая поле в общей памяти, чтобы уведомить клиентов также о прекращении работы).

// This is the server
munmap
close
shm_unlink
sem_close
sem_unlink

// In the client the "cleanup" is:
munmap
close
sem_close

Почему бы мне не сделать последний пост на семафоре sfree в клиенте? Я провел обширное тестирование с небольшим циклическим буфером и большим количеством клиентов, и все же они все выходят и завершаются, как только сервер завершает работу.

Я бы ожидал, что некоторые клиенты зависнут на sem_wait (sfree), потому что он больше не увеличивается после завершения работы сервера.
Я попытался прочитать о sem_close и sem_unlink, но я тоже не думаю, что это объяснение.

...