The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Кто бы мне объяснил по форкам и сокетам (Linux 2.x.x)"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Кто бы мне объяснил по форкам и сокетам (Linux 2.x.x)"
Сообщение от XMan Искать по авторуВ закладки on 25-Авг-01, 18:32  (MSK)
Тут недавно столкнулся с такой интересной ситуацией.
Есть программа-демон, которая слушает порт и при появлении клиента вызывает fork() а сама опять слушает. Потомок открывает соединение с определенным адресом и представляет собой прозрачный прокси-сервер между клиентом и тем сервером. В конце сеанса оба сокета (с клиентом и с сервером) закрываются и потомок завершается по exit(0).
Это описание алгоритма работы программы. Теперь, собственно, ситуация. Закрытый в потомке сокет, который был получен от папы, остается открытым в папе. В связи с этим, через некоторое время папа начинает говорить "Too many open files". С другой стороны, недавно помогал писать сетевую программу, по началу схожую с этой. Там такого не наблюдается - сокет, закрытый в потомке, закрывается и в папе.

А теперь вопрос - как и в каких ситуациях всё это работает ?

Пока проблема решилась примерно так:
...
int ClientSocket=accept(...);
... N проверок и разблокирование сокета ...
switch (fork()) {
  case -1: ошибка
  case  0: потомок
  default: sleep(1); close(ClientSocket);
};
...

При этом потомок продолжает работать как ни в чем не бывало.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "RE: Кто бы мне объяснил по форкам и сокетам (Linux 2.x.x)"
Сообщение от romanSA Искать по авторуВ закладки on 27-Авг-01, 11:23  (MSK)
Тут несколько моментов:
1) клиентский сокет нужно в "папе" закрывать СРАЗУ после fork(). Это наиболее правильно.
sleep() ставить не рекомендую. И код захламляется и выгоды никакой.

2) потомок рекомендуют завершать вызовом _exit(2) а не exit(3). А если используется vfork () то ТОЛЬКО _exit(2).

3) во втором случае (когда сокет, закрываемый в потомке, закрывается и в "папе") вероятно используется не fork(), а vfork(). В этом случае потомок живёт в адресном пространстве родителя и имеет доступ ко всем его ресурсам.

P.S. Лучший источник по использованию сокетов - Unix Network Programming (R.Stevens). Если можешь достать - очень пригодится.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "RE: Кто бы мне объяснил по форкам и сокетам (Linux 2.x.x)"
Сообщение от XMan Искать по авторуВ закладки on 27-Авг-01, 16:48  (MSK)
В принципе, я так и понял, но вот в другой програмке все работает через fork и без закрытия сокета в папе. Хотя может быть я этот close просто и не заметил.
Все равно спасибо. Теперь хоть определился, что у меня это работает правильно :))

>P.S. Лучший источник по использованию сокетов
>- Unix Network Programming (R.Stevens).
>Если можешь достать - очень
>пригодится.

Искал на бумаге - не нашел. Может url есть какой ?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "RE: Кто бы мне объяснил по форкам и сокетам (Linux 2.x.x)"
Сообщение от romanSA Искать по авторуВ закладки on 30-Авг-01, 11:48  (MSK)
К сожалению Stevens-a я в электронном виде не нашёл.
Некоторые полезные ссылки по сокетам можно найти здесь:
http://www.lowtek.com/sockets/
  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "RE: Кто бы мне объяснил по форкам и сокетам (Linux 2.x.x)"
Сообщение от XMan Искать по авторуВ закладки on 31-Авг-01, 18:52  (MSK)
Спасибо, посмотрим :))
  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "RE: Кто бы мне объяснил по форкам и сокетам (Linux 2.x.x)"
Сообщение от grey emailИскать по авторуВ закладки on 12-Сен-01, 18:05  (MSK)
Мне кажется: "сокет, закрытый в потомке, закрывается и в папе" -такого не может быть.
Если потомок - новый процесс, то это свое
адресное пространство, значит что-бы мы не делали
в потомке, это не будет влиять на родителя.
Все это справедливо если переменная не в разделяемой память и если это процесс а не pthread, кроме этого, если переменная не указатель, в этом случае могут быть неожиданности.
Новый сокет нужно закрывать в родителе.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "RE: Кто бы мне объяснил по форкам и сокетам (Linux 2.x.x)"
Сообщение от XMan Искать по авторуВ закладки on 12-Сен-01, 18:45  (MSK)
>Мне кажется: "сокет, закрытый в потомке,
>закрывается и в папе" -такого
>не может быть.
Тем не менее, я такое наблюдал.

> Если потомок - новый процесс, то это свое
> адресное пространство, значит что-бы мы не
> делали в потомке, это не будет влиять на
> родителя.

Вот ситуация, показывающая, насколько тесно связаны потомок и родитель, работающие с потоками данных.

Программа открывает файл и создает потомка. Потомок читает что-то из файла, закрывает его и выходит. После этого родитель читает чего-то из файла, закрывает его и выходит. Так вот, если потомок прочитал, например, 10 байт, начиная с 0-го смещения, то родитель прочтет данные, которые начинаются с 10-го смещения.

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру