Я занимаюсь разработкой серверной программы, которая обслуживает несколько клиентов несколькими дочерними процессами. Я использую только одну очередь сообщений System V для связи между родительским процессом и дочерним процессом. Каждый процесс будет ожидать сообщения с mtype, равным идентификатору процесса. Каждый дочерний процесс взаимодействует только с родительским процессом. В родительском процессе я вызываю msgrcv с флагом IPC_NOWAIT, чтобы предотвратить блокировку для обработки других материалов. С двумя дочерними процессами он работает как положено, но когда количество дочерних процессов увеличивается, проблема будет выглядеть следующим образом:
- Если я установлю флаг для msgsnd в IPC_NOWAIT, некоторые дочерние процессы не смогут отправить сообщение родительскому процессу с ошибкой EAGAIN. Если я добавлю механизм для повторной отправки сообщения с такой ошибкой, он все равно не будет работать, и родительский процесс не получит сообщение.
- Если я установлю флажок для msgsnd из IPC_NOWAIT, некоторые дочерние процессы будут заблокированы в этом вызове функции msgsnd. Родительский процесс не получает никаких сообщений.
Итак:
- Как я могу исправить эту проблему?
- Если нет, можете ли вы порекомендовать мне архитектора для решения моей проблемы?
Моя система - Centos 7. Размер сообщения составляет 300 байт.