Reader с общей памятью (только для чтения) зависает при завершении работы Writer - PullRequest
1 голос
/ 24 мая 2011

В Linux, C, используя общую память, у меня есть один процесс Writer и много Readers.

Когда Writer завершает работу, все работающие Reader зависают. Writer делает shm_unlink, когда он завершается.

Я подумал, что, возможно, неправильно, что ядро ​​знает о читателях и что они могут продолжать читать. Конечно, данные не изменятся, поэтому читатели могут знать, когда закончить изящно.

Есть идеи, как этого добиться?

Ответы [ 2 ]

0 голосов
/ 24 мая 2011

В linux ядро ​​не знает о ваших читателях или писателях (или, ну, не знает, что есть что).И shm_unlink просто удаляет имя;он не удаляет сегмент shmem, пока все пользователи не отобразят его, не закроют или не прекратят работу.Если эти читатели / писатели общаются и блокируют мьютексы / семафоры pshared , то, когда писатель умирает, вы действительно можете повесить читателей.Лучше всего, чтобы автор оставил сообщение в очереди, чтобы сообщить читателям, что оно заканчивается.

0 голосов
/ 24 мая 2011

Вы можете иметь флаг в заголовке, который вы создаете в общей памяти, чтобы указать EOF.У вас может быть временная метка, которую вы периодически обновляете для обнаружения нечистого завершения писателя /

Вы также можете использовать shmctl, чтобы узнать количество прикрепленных людей, что может помочь вам выяснить, ушел ли писатель.

Вы можете также попытаться повторно присоединить / fstat, чтобы проверить, что сегмент не был удален.

Если эти ответы не удовлетворяют, пожалуйста, сообщите нам, является ли это разделяемой памятью POSIX или System V.

...