2015-03-30 3 views
1

У меня есть программа Linux C, где я передаю данные между потоками. Я искал использование очередей сообщений POSIX для решения этой проблемы, поскольку они не требуют взаимных блокировок/блокировок.POSIX очереди сообщений для передачи данных между Pthreads

Глядя на вызов mq_open(), я должен указать разрешения и путь к очереди. Это приводит меня к двум вопросам.

  1. Есть ли известное соглашение для указания пути к файлу? Я был , просто отправляя очереди в той же папке, что и исполняемый файл.
  2. Что касается разрешений, я собирался использовать 0600, но я хочу еще больше ограничить это, чтобы другие процессы не обращались к очередям (я делясь данными между потоками, а не процессами). Учитывая, что очередь является «просто» файлом, могу ли я использовать flock() с LOCK_EX для предотвращения доступа из других процессов?

Заранее спасибо.

+0

Поскольку вы используете потоки, они имеют одинаковое адресное пространство. (Который является целым аспектом использования потоков.) Почему бы не использовать, например, блок памяти или связанный список *, защищенный мьютексом * для обмена данными? –

+0

В FIFO существует много производителей-потребителей. Поэтому, хотя, да, я могу создать буфер FIFO и управлять им с помощью мьютекса, я чувствую, что хороший фрагмент этой функциональности уже доступен в очередях сообщений. –

ответ

2

Что касается вашего вопроса 1, обратите внимание на примечания к внедрению для mq_open в вашей системе. По крайней мере, в именах очередей сообщений Linux и FreeBSD должен начать с косой черты, но не должен содержать другие косые черты.

Так как имя очереди сообщений выглядит как путь, он может быть или не быть фактическим inode в файловой системе, в зависимости от реализации. Согласно mq_overview(7), Linux использует виртуальную файловую систему для очередей сообщений, которые могут быть или не быть смонтированы.

В связи с этим вопрос 2 может быть спорным. Вам нужно будет запустить тест или проверить источник ядра, если блокировка файла в /dev/mqueue фактически поддерживается даже в случае, если он выполняет то, что вы хотите.

1

Я бы не стал защищать очередь от внешних процессов.

Поскольку стая только консультативная не обязательна, она не принесет вам пользы. Также я не уверен, что стая даже будет работать с дескрипторами очереди.

Выполнение службы, поскольку ее собственный пользователь будет поддерживать другие процессы от возможности доступа к очереди с режимом 0600, конечно.

Я бы, однако, обеспечил при запуске, только одна служба может работать в очереди за раз. Для этого вы можете использовать блокировку pid или d-bus.

Смежные вопросы