Как спроектировать асинхронную обработку сокетов nanomsg и tty или Netlink?
Как я могу написать основной цикл (в C для системы Linux), который блокирует во время ожидания сообщений из нескольких источников, таких как
а) гнездо nanomsg и последовательный порт, или
б) сокет nanomsg и сокет Netlink?
Когда начать?
Я думаю, что я мог бы опрашивать сокет nanomsg, затем опрашивать последовательный порт, а затем спать в течение, например, 0,1 секунды, но это шаблон, который я хотел бы избежать, если это возможно.
1 ответ
Если вышеприведенный подход является способом, который вы не хотите использовать, то можно сделать это:
1)
Создайте поток с помощью автономного последовательного порта -сканера, оснастите этот поток PAIR/PAIR
или же PUSH/PULL
(как видно со стороны потока сканера портов) соединение с основным, лучше всего использовать транспортный класс с нулевой или низкой служебной нагрузкой ~ inproc://
или же ipc://
(tcp://
транспортный класс просто тратит слишком много накладных расходов на передачу сигналов / сообщений между потоками). Сделайте так, чтобы этот поток сканера отправлял все, что вам нужно, по этой восходящей линии связи на основную, когда вы чувствуете это соответствующим
2)
Создание резьбы с помощью автономного сканера nanomsg, оснащение этой нити PAIR/PAIR
или же PUSH/PULL
(как видно со стороны потока сканера сокета) соединение с основным, лучше всего использовать транспортный класс с нулевой или низкой служебной нагрузкой ~ inproc://
или же ipc://
, Сделайте так, чтобы этот поток сканера отправлял все, что вам нужно, по этой восходящей линии связи на основную, когда вы чувствуете это соответствующим
3)
Оборудовать main()
с обоими соответствующими контрагентами ( 2x PAIR
или 2x PULL
-s), как определено в 1) и 2), и поддерживать эту инфраструктуру плоскости сигнализации / обмена сообщениями между потоками в рабочем состоянии.
4)
Наслаждайтесь "комфортом" тривиального вызова блокировки .poll()
в main(){...}
(как вы и хотели выше, в то время как я профессионально выступаю за использование неблокирующего кода, всегда... но также признаю, но не уважаю ваше высказанное выше желание потерять свой собственный контроль кода во время неопределенно долгого ожидания события разблокировки - если когда нибудь придет)
5)
Учитывая .poll()
есть какое-то сообщение, сделать aRetCODE = nn_recv( aS, &B, aBsz, NN_DONTWAIT );
чтение соответствующей сигнальной восходящей линии связи из любого из потоков сканера.
6)
Loop.