Получение определенного сообщения из очереди сообщений POSIX - PullRequest
1 голос
/ 07 марта 2011

Я должен написать приложение на C в Unix так, чтобы N дочерние процессы были разветвлены от родительского процесса, и я буду отправлять сообщения этим дочерним элементам, а дети должны отправлять сообщения друг другу.

Однако проблема в том, что мне нужно отправлять сообщения конкретному целевому дочернему процессу. то есть родитель отправит ребенку 1, ребенок 1 отправит ребенку 2, ... и ребенок n отправит 1 (по кругу).

Проблема в том, что, если я создаю только одну очередь сообщений, любой из n дочерних элементов может удалить сообщение из очереди (поскольку любой из них может запускаться после родительского процесса из-за планировщика ядра), поэтому сообщение будет удалено из очереди в неправильном процессе!

В моем приложении будет макс. 1 сообщение в очереди за раз. Единственное решение, которое приходит мне в голову, - это создавать n различные очереди сообщений и передавать сообщения в соответствующую очередь, чтобы конкретный целевой процесс мог ее получить. Но я думаю, что должно быть более законное решение.

Есть идеи?

Ограничения: каналы между процессами не разрешены, я знаю, что mq здесь неэффективен. Я тоже буду их реализовывать, оба требуются. P.S. Это своего рода домашнее задание (черт возьми, я создатель http://canyoudomyhomework.com), однако это не просто домашнее задание, ИМХО сложный вопрос.)

1 Ответ

1 голос
/ 28 марта 2011

В зависимости от требований к производительности наиболее подходящим является брокерское (маршрутизаторное) решение.

Родитель может выступать в роли маршрутизатора или порождать определенный процесс для выполнения этой работы.Определив простую структуру сообщения, в которой первый элемент назначен как целевой объект, мы также можем обозначить родительский процесс как ноль.

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

Удачи

...