utros 20.10.2011 03:55 pedobook

Киньте в меня ссылкой в ман или расскажите как решить вот такую задачу:
Есть программка %program%, которая принимает keep-alive подключения на порту 1234. Задача: запустить несколько экземпляров этой программы на одной машинке и раздавать tcp-соединения, приходящие на порт 1234 хоста процессам этой программы.
Весь код есть, язык — c.
Я подозреваю, что мне нужно будет из своего процесса открыть соединение, форкнуться нужное количество раз и из дочерних процессов и сделать exec. Но я пока не до конца понимаю, какие тут подводные камни и вообще хотелось бы получше разобраться как вся эта магия работает.

1. gelraen 20.10.2011 04:02

сделай чтобы твоя мега-программа работала с stdin/stdout и подсунь её под inetd

2. utrosgelraen /1 20.10.2011 04:04 pedobook

Каждый процесс будет работать с кучей соединений и я не очень хорошо понимаю как разруливать их при таком подходе.

3. gelraenutros /2 20.10.2011 04:13

а, с кучей... тогда тебе в любом случае придётся модифицировать исходную программу. Или чтобы она была многопоточной, или чтобы сама форкалась после listen(2). Я не уверен даст ли нужный результат использование SO_REUSEADDR | SO_REUSEPORT.

4. utrosgelraen /3 20.10.2011 05:19

В идеале хотелось бы, чтобы всё работало как в nginx (фиксированное количество воркеров и один мастер-процесс).
Многопоточности очень не хочется. Форкаться на каждое соединение тоже не ок, ибо тормоза будут адские.

6. gelraenutros /4 20.10.2011 05:40

Я и не предлагаю форкаться на каждое соединение, сделай listen(2) и форкнись сколько тебе нужно, а потом уже в каждом процессе запускай цикл с poll/kqueue/epoll/whatever. Как-то так все это и работает, насколько я понимаю.

7. gelraengelraen /6 20.10.2011 05:42

А если хочешь более точного контроля — принимай соединения в родительском процессе, а потом отдавай дескрипторы чайлдам вручную через unix socket

8. gelraenvt /5 20.10.2011 06:07

годно

9. 0x2207 20.10.2011 07:14 epsilon

xinetd. ?

10. utrosvt /5 20.10.2011 07:41

да, читал. Интересная вещь.

11. utrosgelraen /6 20.10.2011 07:43

Ну я об этом и написал в /0.
Что можно почитать по этому поводу?

12. gelraenutros /11 20.10.2011 08:39

нет, ты писал о немного другом. тебе надо чтобы сначала программа делала listen(2), а потом уже форкалась, тогда у всех чайлдов будет listening socket и они все смогут делать на него accept(2). А в /0 ты написал о внешней программе, которая нафоркается и каждый чайлд запустит программу которая будет делать listen(2) (что, впрочем, делается одним циклом на sh, никакой программы писать не нужно). И в твоём варианте без добавления SO_REUSEADDR|SO_REUSEPORT на сокет в вызываемой программе слушающий сокет получит только первая которая успеет, остальные получат EADDRINUSE от bind(2).

13. gelraenutros /11 20.10.2011 08:41

man fork. остальное ничем не отличается от однопроцессного варианта.

14. utrosgelraen /12 20.10.2011 09:28

Ну да, кривовато как-то сформулировал /0.
И да, спасибо.

Do you really want to delete ?