fork & socket
От: Аноним  
Дата: 11.06.10 04:49
Оценка:
Добрый день.

Возможно ли передать сокет другому процессу. Задача усложняется тем что пул процессов должен быть создан заранее и в каждом из процессов свой "движек" запускаемый через exec.
Т.е. парент процесс слушае и "диспетчерезирует" входящие соединения и в зависимости от контекста должен отдавать сокет тому или иному дочернему процессу. и опять же как "движек" должен получить сокет?


11.06.10 12:40: Перенесено модератором из 'C/C++' — Кодт
Re: fork & socket
От: hooky-mars  
Дата: 11.06.10 06:12
Оценка:
По идее сокет это дескриптор, передаете его своему процессу через, например, систему событий ОС, в LParam
Re[2]: fork & socket
От: hooky-mars  
Дата: 11.06.10 06:18
Оценка:
Здравствуйте, hooky-mars, Вы писали:

HM>По идее сокет это дескриптор, передаете его своему процессу через, например, систему событий ОС, в LParam

Хотя, врядли этобудет работать.
Да и вообще врядли такое возможно.
Разве только настроить в дочерних потоках сокет слушающий все пакеты. А родительский процесс, передает этому доечернему параметры фильтрации, но в таком случае не рпотает отправка.
Re[2]: fork & socket
От: _ASD_  
Дата: 11.06.10 07:17
Оценка:
Здравствуйте, hooky-mars, Вы писали:

HM>По идее сокет это дескриптор, передаете его своему процессу через, например, систему событий ОС, в LParam


Процессы седенены pipe-ми
Re: fork & socket
От: uzhas Ниоткуда  
Дата: 11.06.10 07:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добрый день.


А>Возможно ли передать сокет другому процессу. Задача усложняется тем что пул процессов должен быть создан заранее и в каждом из процессов свой "движек" запускаемый через exec.

Передавайте сокет другим процессам через любой IPC (разделяемая память, именованные пайпы, TCP, (L)RPC)
Возможно, вокруг секурити надо попрыгать, но должно работать и в винде и в линуксе (со своими платформ-спесифик танцами)
Тип сокета должен быть известен всем процессам (TLS, SSL, etc)
зы: кстати, вы в какой операционке?
Re[3]: fork & socket
От: _ASD_  
Дата: 11.06.10 07:26
Оценка:
Здравствуйте, hooky-mars, Вы писали:

HM>Здравствуйте, hooky-mars, Вы писали:


HM>>По идее сокет это дескриптор, передаете его своему процессу через, например, систему событий ОС, в LParam

HM>Хотя, врядли этобудет работать.
HM>Да и вообще врядли такое возможно.
HM>Разве только настроить в дочерних потоках сокет слушающий все пакеты. А родительский процесс, передает этому доечернему параметры фильтрации, но в таком случае не рпотает отправка.

Где то видел пример когда fork происходит на accept-е....но это не подходит.
Т.е. гарантированно невозможно получить дескриптор сокета в дочернем потоке(при этом закрыв его в родительском)?
Re[2]: fork & socket
От: _ASD_  
Дата: 11.06.10 07:29
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, Аноним, Вы писали:


А>>Добрый день.


А>>Возможно ли передать сокет другому процессу. Задача усложняется тем что пул процессов должен быть создан заранее и в каждом из процессов свой "движек" запускаемый через exec.

U>Передавайте сокет другим процессам через любой IPC (разделяемая память, именованные пайпы, TCP, (L)RPC)
U>Возможно, вокруг секурити надо попрыгать, но должно работать и в винде и в линуксе (со своими платформ-спесифик танцами)
U>Тип сокета должен быть известен всем процессам (TLS, SSL, etc)
U>зы: кстати, вы в какой операционке?


IPC — pipe
ОС: FreeBSD
Можно ли при этом высвободить ресурс закрыв дескриптор в родители?
Re[3]: fork & socket
От: VitaliyZ Украина  
Дата: 11.06.10 08:07
Оценка:
Здравствуйте, _ASD_, Вы писали:

_AS>Здравствуйте, uzhas, Вы писали:


U>>Здравствуйте, Аноним, Вы писали:


А>>>Добрый день.


А>>>Возможно ли передать сокет другому процессу. Задача усложняется тем что пул процессов должен быть создан заранее и в каждом из процессов свой "движек" запускаемый через exec.

U>>Передавайте сокет другим процессам через любой IPC (разделяемая память, именованные пайпы, TCP, (L)RPC)
U>>Возможно, вокруг секурити надо попрыгать, но должно работать и в винде и в линуксе (со своими платформ-спесифик танцами)
U>>Тип сокета должен быть известен всем процессам (TLS, SSL, etc)
U>>зы: кстати, вы в какой операционке?


_AS>IPC — pipe

_AS>ОС: FreeBSD

если есть возможность, можно использовать unix domain socket
http://www.freebsd.org/cgi/man.cgi?query=unix&apropos=0&sektion=0&manpath=FreeBSD+8.0-RELEASE&format=html
....
Any valid descriptor may be sent in a message...
....

_AS>Можно ли при этом высвободить ресурс закрыв дескриптор в родители?

уверености нет , но подсознание подсказывает, что нельзя.
Re: fork & socket
От: HiSH Россия http://m0riarty.ya.ru
Дата: 11.06.10 08:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добрый день.


А>Возможно ли передать сокет другому процессу. Задача усложняется тем что пул процессов должен быть создан заранее и в каждом из процессов свой "движек" запускаемый через exec.

А>Т.е. парент процесс слушае и "диспетчерезирует" входящие соединения и в зависимости от контекста должен отдавать сокет тому или иному дочернему процессу. и опять же как "движек" должен получить сокет?

Для UNIX-сокетов есть такакая возможность: http://linux.die.net/man/7/unix (искать SCM_RIGHTS). Но вообще так делат не принято — передача сокетов обычно делается через наследование после fork()'а. Если сделать не один "принимающий" сокет, а по числу контекстов, то задача решается тривиально.
Re[2]: fork & socket
От: _ASD_  
Дата: 11.06.10 09:32
Оценка:
т.е. задача такова: обрабатываются веб-сессии(у клиента браузер).

1. Родительский процесс порождает дочернии процессы.
2. Слушает порт.
3. получает входящую сессию от клиента, соотносит с внутренней таблицей маршрутизации процессов. Если новый клиент заставляет его авторизоваться, если уже "засветился" отдает дескриптор сокет сопоставимому дочернему процессу.
4. дочерний процесс обрабатывает запрос пользователя, и отдает ответ пользователю. сохраняя сессию клиента, как бы "зеркаля" состояние клиента.
5. и т.д.

Т.е. запросы клиента(вернее ответы для него очень объемные), тем самым дочерний процесс должен был сохранять текущее состояние клиента, для последуещго запроса
Re: fork & socket
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 11.06.10 15:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Возможно ли передать сокет другому процессу. Задача усложняется тем что пул процессов должен быть создан заранее и в каждом из процессов свой "движек" запускаемый через exec.


google://SCM_RIGHTS
в сети есть готовые примеры. Работает, кажется, везде, где Unix и BSD sockets (винду не вспоминать).

А>Т.е. парент процесс слушае и "диспетчерезирует" входящие соединения и в зависимости от контекста должен отдавать сокет тому или иному дочернему процессу. и опять же как "движек" должен получить сокет?


Вот так и получает.

Но вообще есть и другие методы. Например, Apache с prefork'ом делает, что процессы из пула решают, кто сейчас обрабатывает следующее соединение.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.