У меня есть многопроцессный проект.
Один сервер, который прослушивает и читает из кольцевого буфера, и несколько клиентов, которые записывают в кольцевой буфер.
У меня 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, но я тоже не думаю, что это объяснение.