LINUX.ORG.RU

Prefork-сервер и CMSG. Как это работает?

 , , , ,


0

1

Всем привет.

Суть вопроса такова.

Делаю свой prefork-сервер, где каждое новое клиентское соединение обрабатывается свободным дочерним процессом. Мастер-процесс получет инфу о доступности того или иного потомка посредством сигналов. И все бы вроде ничего, но вот недавно узнал про такую вещь как системные вызов sendmsg и recvmsg, которые позволяют передавать сокет или файловый дескиптор от процесса процессу.

Стало интересно, КАК (т.е. сам концепт как это использовать) можно заюзать данный механизм в контексте prefork-сервера и можно ли вообще это использовать? Какой можно получить профит от использования CMSG? Кто имел с этим дело, подскажите, пжлста.

Разве там может быть много вариантов использования? master получает соединения через тот же accept(), а потом передаёт дескриптор slave на обработку через UNIX domain socket, который они все читают (кто забрал, тот и обрабатывает).

xaizek ★★★★★
()

И все бы вроде ничего, но вот недавно узнал про такую вещь как системные вызов sendmsg и recvmsg, которые позволяют передавать сокет или файловый дескиптор от процесса процессу.

Они позволяют работать с голыми ethernet фреймами.

Открытый дескриптор в другой, уже существующий процесс не передашь.

mv ★★★★★
()
Ответ на: комментарий от mv

Открытый дескриптор в другой, уже существующий процесс не передашь.

Как это «не передашь»? Всегда ж можно было.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

и память можно, и дескрипторы передавать в другой процесс.

Но да, это специфично для линукса, а самое главное, что prefork сервер в 2019 году писать как-то не халяльно.

max_lapshin ★★★★★
()
Ответ на: комментарий от max_lapshin

память нельзя если она не шаред, а она не шаред по умолчанию через всякие malloc/calloc

anonymous
()

Заюзать, то можно, но профита скорее всего не будет. Для префорк знаю 3 варианта:

1. SO_REUSEPORT - ядро само раскидает соединения по воркерам. Очевидно, самый дешевый варант.

2. мьютекс на listen сокет - кто захватил тот и делает accept()/добавляет в свой epoll. Тоже дешево, но теоритечески (на практике ни разу не ловил такое) может выигрывать один и тот же воркер.

3. accept() в мастере и передача сокета через SCM_RIGHTS (оно кстати есть на всех *никс)нужному воркеру. Минимум 2 лишних сискола на каждого клиента. Но можно самому, более гибко чем в вариантах 1 и 2 рулить загрузкой воркеров.

anonymous
()
Ответ на: комментарий от anonymous

Спасибо, немного продвинулся в понимании.

KernelPanic
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.