У меня есть родительский процесс, который создает 2 серверных сокета и вызывает select()
, чтобы ждать нового соединения. Когда соединение приходит, сообщение отправляется дочернему процессу (создается с помощью fork()
, после создания сокетов серверов, поэтому они совместно используются).Почему select() в родительском процессе делает accept() непригодным в дочернем процессе?
У этого ребенка вызов accept()
на серверный сокет не работает. Я получил ошибку EAGAIN
(неблокирующий сокет). В то время как вызов accept()
в основном процессе работает отлично.
Конечно, я не звоню accept()
в основном процессе, я просто проверял, работает ли он, и это так.
Почему я не могу позвонить accept()
в дочернем процессе после select()
в родительском?
EDIT: Цель состоит в том, чтобы создать фиксированное количество рабочих (допустим, 8) для обработки клиентских подключений, как в модели предкара. Эти соединения будут длинными соединениями, а не HTTP. Цель состоит в том, чтобы установить баланс между рабочими.
Для этого я использую переменную разделяемой памяти, которая содержит для рабочего число подключенных клиентов. Я хочу «спросить» у работника самое низкое количество клиентов для обработки нового соединения.
Вот почему я делаю select()
в родительском, а затем отправляю сообщение дочернему процессу, потому что хочу «выбрать», какой процесс будет обрабатывать новое соединение.
Сервер прослушивает более одного гнезда (по одному для SSL, один без), поэтому я использую select()
и непосредственно не accept()
в детских процессов, потому что я не accept()
на тройники в моих детей рабочих могут.
EAGAIN на самом деле не является ошибкой per sé, это означает, что вызов был неблокирующим, но соединение не было готово. Просто спите немного и попробуйте еще раз. Любая другая ошибка, чем EAGAIN, конечно, является фактической ошибкой. –
Почему бы не назвать 'accept' первым перед вами fork? Специально, поскольку вы знаете, что это работает. –
Я не понимаю, что вы делаете. Не могли бы вы высказать минимальный код, чтобы мы могли воспроизвести ваше наблюдение? – moooeeeep