Как стать автором
Обновить

Комментарии 8

Как не обычно! Никто до этого раньше не додумался!

Почему из recv возврат не проверяется? Сокет-то неблокирующий. А ну он -1 вернёт и -EGAIN поставит?
Есть косячки по коду — не спорю… но дело не в коде, а в концепции…
Это не косяк, это stack corruption и, возможно, SEGV.

Концепция хорошая, но, конечно-же, не новая. Если правильно помню, postfix так общается между частями.
Концепция, конечно же не новая… для этого в общем и задумывались локальные сокеты…
просто я не особо много материала нашел по этой теме в инете… значит мало кто этим пользуется… а оказывается это так удобно :)
У нас даже в Самаре это было в обязательном курсе программирования.

Посмотрите, я не знаю, mysql что-ли. MySQL по-умолчанию использует unix-socket.

ilen = recv( ns, &lbuf, 255, 0 );
А вот это просто ошибка. Не &lbuf, а lbuf.
Несомненно большие проекты, что MySQL, что Postfix умеют работать с этой технологией…
А про ilen = recv( ns, &lbuf, 255, 0 ); — у меня так компилятор не ругнулся… давно на Си не писал :)
Кстати, я был не прав: новый сокет не является неблокирующим, состояние из ctrlsck не копируется в новый сокет.
Как же легко… узнать стиль автора… в других статьях… на Хабре :)

А вообще — можно не создавать директорию с сокетами заранее, а вызвать socketpair() и форкнуться — в родителе записать первый сокет в массив “клиентов”, а второй использовать из дочернего процесса для связи с родителем. Таким образом, достигается тот же результат, что и в вашем случае, только вообще без надобности использовать ФС и с переносимостью под системы, где нет UNIX-сокетов, а вместо них используются INET-сокеты, например.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий