Семафор общей памяти
-
05-07-2019 - |
Вопрос
У меня запущено 10 процессов, каждый из которых записывает данные в один и тот же файл.Мне не нужно несколько авторов, поэтому в основном я ищу мьютекс / двоичный семафор для защиты записи в файл.Проблема в том, что я не могу разделить семафор между 10 процессами, поэтому я рассматриваю возможность использования общей памяти между 10 процессами и помещения семафора в общую память, чтобы к нему мог получить доступ каждый процесс.
Кто-нибудь может указать мне на документацию по этому вопросу на C / C ++ для Unix?Пример кода для использования этой структуры был бы отличным.
Спасибо
Решение
Это звучит так, как будто вам было бы лучше использовать flock(2)
:
flock(fd, LOCK_EX);
n = write(fd, buf, count);
flock(fd, LOCK_UN);
Другие советы
Помещение семафора в общую память - не лучшее решение этой проблемы (если оно вообще будет работать).Вам следует изучить блокировку файлов, которая является функцией UNIX, специально разработанной для обеспечения эксклюзивности среди разработчиков файлов.
В частности, проверьте:
Дополнительные пояснительные материалы см. Расширенное программирование в среде UNIX, раздел 14.3
Взгляните на Сетевое программирование UNIX Vol.2 автор W.Ричард Стивенс.
Это лучшая книга, когда-либо написанная на эту тему.
Вы могли бы использовать мьютексы PTHREAD.При инициализации мьютекса вам необходимо использовать pthread_mutexattr_setpshared pthread_mutexattr_setpshared функция, позволяющая сделать мьютекс общим для всех процессов, а затем поместить его в общую память.Все процессы могут подключаться к общей памяти, а затем получать доступ к мьютексу.
Также вы могли бы добавить дополнительные атрибуты к SHM на основе ваших требований к блокировке (рекурсивный и т.д.,)
Как насчет использования UNIX IPC для создания общей очереди?Один процесс считывает очередь и записывает в файл, все остальные процессы помещают данные в очередь.