Проблема с одной системой v очередь сообщений для нескольких процессов чтения / записи - PullRequest
0 голосов
/ 13 ноября 2018

Я занимаюсь разработкой серверной программы, которая обслуживает несколько клиентов несколькими дочерними процессами. Я использую только одну очередь сообщений System V для связи между родительским процессом и дочерним процессом. Каждый процесс будет ожидать сообщения с mtype, равным идентификатору процесса. Каждый дочерний процесс взаимодействует только с родительским процессом. В родительском процессе я вызываю msgrcv с флагом IPC_NOWAIT, чтобы предотвратить блокировку для обработки других материалов. С двумя дочерними процессами он работает как положено, но когда количество дочерних процессов увеличивается, проблема будет выглядеть следующим образом:

  • Если я установлю флаг для msgsnd в IPC_NOWAIT, некоторые дочерние процессы не смогут отправить сообщение родительскому процессу с ошибкой EAGAIN. Если я добавлю механизм для повторной отправки сообщения с такой ошибкой, он все равно не будет работать, и родительский процесс не получит сообщение.
  • Если я установлю флажок для msgsnd из IPC_NOWAIT, некоторые дочерние процессы будут заблокированы в этом вызове функции msgsnd. Родительский процесс не получает никаких сообщений.

Итак:

  • Как я могу исправить эту проблему?
  • Если нет, можете ли вы порекомендовать мне архитектора для решения моей проблемы?

Моя система - Centos 7. Размер сообщения составляет 300 байт.

1 Ответ

0 голосов
/ 13 ноября 2018

Код не указан.Лучше всего проверить возвращаемые значения ошибки и обратиться к странице руководства.На GDB вы можете пройти один шаг до точки, где дочерний процесс не может отправить сообщение

...