Войти

Показать полную графическую версию : Опрос неименованых каналов


evpu
28-11-2015, 21:48
Всем добрый день!

Вопрос есть, подскажите)!

Тот же Linux, тот же чистый С.

Есть один родительский процесс, порождающий N-ное количество дочерних. Неизвестно заранее сколько. 100-10000 примерно.
Использую fork(). Хочу, чтобы при создании процесса формировалось pipe, через который будет производиться обмен с дочерним.
Соответственно, сколько будет pipe тоже заранее неизвестно.

Как грамотно организовать опрос всей совокупности pipe, на предмет получения сообщения от дочернего процесса?
Требуется некоторым образом производить read их всех, по очереди, в бесконечном цикле.

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

evpu
28-11-2015, 21:59
Смысл тут прост. Я хочу чтобы в головном процессе был открытый на прием-передачу UDP-порт, на который будут посылать сообщения удаленные устройства. Каждое устройство имеет свой идент, по которому можно однозначно его идентифицировать, и открыть дочерний процесс для этого идента. Все это я уже сделал. Все бы хорошо, но после создания процесса общение с устройством переходит на дочерний процесс, с новым номером исходящего порта.

Вот я и надумал, сделать сепаратор между "шлюзовым" UDP-портом, и всеми дочерними потоками и их pipe. Содержимое bind-структур я буду кодировать внутри сообщений отправляемых по pipe, при извлечении данных от "дочки" сепаратор будет декодировать сообщение на само сообщение и sendto-структуру, это не особенно сложно.

Но вот как организовать опрос всех открытых pipe? Особенно учитывая, что их количество будет динамически меняться (дочерние процессы имеют свойство закрываться по таймауту если нет обмена).

Т.е по сути - тут попытка более-менее полной имитации TCP на UDP, по крайней мере в плане аналогии с многопотоковыми ТСР приложениями типа APACHE.

User001
02-12-2015, 09:46
Но вот как организовать опрос всех открытых pipe? Особенно учитывая, что их количество будет динамически меняться (дочерние процессы имеют свойство закрываться по таймауту если нет обмена). »По идее, самым быстрым должен быть epoll (https://ru.wikipedia.org/wiki/Epoll).
Есть один родительский процесс, порождающий N-ное количество дочерних. Неизвестно заранее сколько. 100-10000 примерно. »Вы уверены, что вам нужно именно процессы (а не потоки) и именно такое количество? Не знаю, какая у вас нагрузка и какая железка, но звучит страшно.
Т.е по сути - тут попытка более-менее полной имитации TCP на UDP »Вы не UDT (https://rsdn.ru/forum/network/5111457.all) реализуете ;)?

evpu
12-12-2015, 14:35
>>Вы не UDT реализуете
Не, самодельный алгоритм... Не это.
Напоминает TFTP

>>процессы (а не потоки)
Да, Вы правы - потоки. Получаются через fork(). По началу заимею что-то типа i5, потом можно будет и Xeon поставить.




© OSzone.net 2001-2012