The OpenNET Project / Index page

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

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

"лимит открытых файлов на процесс или на юзверя?"
Сообщение от Arifolth emailИскать по авторуВ закладки(ok) on 01-Сен-04, 13:28  (MSK)
ось - линукс ядро 2.2
есть программа на сях
которая биндится на один интерфейс
лупит в цикле
{
listen()  //например на 450 порту
accept()  //новый дкскриптор сокета
fork()    //далее общается дочерний процесс
}
форкнутый процесс биндится на второй интерфейс

к ней коннектяться другие проги, обмениваются пакетиками после чего соединение завершается а форкнутый процесс прибивается(не висит в зомби)
но вот када примерно 1020 "клиент" стучиться,
после вызова listen()
одновременно:
прога ребёнок валиться при попытке создания сокета на втором интерфейсе
со словами Too many open files
прога родитель валиться на accept() со словами
Too many open files
и больше сокетов на втором интерфейсе не создаёт

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

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

 Оглавление

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

1. "лимит открытых файлов на процесс или на юзверя?"
Сообщение от XMan Искать по авторуВ закладки(??) on 01-Сен-04, 13:52  (MSK)
Слышь... Ты бы это... Закрывал сокеты в родителе :)
  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "лимит открытых файлов на процесс или на юзверя?"
Сообщение от Arifolth Искать по авторуВ закладки(ok) on 01-Сен-04, 14:38  (MSK)
>Слышь... Ты бы это... Закрывал сокеты в родителе :)

нее
дочерние процессы закрывают сокеты при завершении
в родителе один сокет - для LISTEN

в чём всё-таки проблема?
почему слишком много открытых файлов?

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

4. "лимит открытых файлов на процесс или на юзверя?"
Сообщение от XMan Искать по авторуВ закладки(??) on 01-Сен-04, 17:58  (MSK)
> в родителе один сокет - для LISTEN

Это ты с чего взял ? А accept что родителю возвращает ? Простую циферку ? :)

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

5. "лимит открытых файлов на процесс или на юзверя?"
Сообщение от Arifolth Искать по авторуВ закладки(ok) on 02-Сен-04, 09:22  (MSK)
>> в родителе один сокет - для LISTEN
>
>Это ты с чего взял ? А accept что родителю возвращает ?
>Простую циферку ? :)

значение accept передается параметром в функцию  где процесс форкается - поэтому там оно становиться локальным
а по завершении, как я и сказал, форкнутый процесс закрывает сокет с этим дескриптором
а accept при новой итерации возвращает новую циферь =) родителю
так что закрывать нечего

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

6. "лимит открытых файлов на процесс или на юзверя?"
Сообщение от XMan Искать по авторуВ закладки(??) on 02-Сен-04, 15:23  (MSK)
Чего ? Ты что - сначала делаешь fork(), а потом в потомке accept() ? Инетерсный подход :)

Если же ты всё-таки делаешь accept в родителе, а в потомке только используешь результат этой функции, то тебе нужно в родителе и закрывать этот сокет. По хорошему, если ты всё делаешь правильно, то родителю будет возвращаться один и тот же сокет при каждом вызове accept.

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

7. "лимит открытых файлов на процесс или на юзверя?"
Сообщение от XMan Искать по авторуВ закладки(??) on 02-Сен-04, 15:27  (MSK)
В качестве примера:

...
while (1) {
  s=accept(...);
  switch (fork()) {
    case 0: // потомок
                ... close(s); ...
    case -1: // ошибка...
  };
  // родитель
  close(s);
  ...
};

Вот это более менее правильно.

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

8. "лимит открытых файлов на процесс или на юзверя?"
Сообщение от Arifolth Искать по авторуВ закладки(??) on 02-Сен-04, 17:26  (MSK)
>В качестве примера:
>
>...
>while (1) {
>  s=accept(...);
>  switch (fork()) {
>    case 0: // потомок
>            
>    ... close(s); ...
>    case -1: // ошибка...
>  };
>  // родитель
>  close(s);
>  ...
>};
>
>Вот это более менее правильно.
не катит это =(
на сервер постоянно клиенты будут ломиться а тут первый же отваливается моментально(!)
на сервере:
читаем из сокета < 0  и вываливаемся со словами:
...
: Unknown error: 0
...
пробуем вручную:
su-2.05b# telnet 192.168.224.124 50002
Trying 192.168.224.124...
Connected to arifolth.rubin.
Escape character is '^]'.
Connection closed by foreign host.
su-2.05b#

мне кажется что это не удивительно (хотя есть одно но...) т/ к/ форкнутый прцесс не сразу начинает работать - проходит какое-то время а за это время выполняется close(s) в родителе =|

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

9. "лимит открытых файлов на процесс или на юзверя?"
Сообщение от XMan Искать по авторуВ закладки(??) on 02-Сен-04, 17:59  (MSK)
Как бы это сказать... Сокет держится открытым до тех пор, пока есть хоть один процесс, который с ним работает. fork создает точную копию данных родителя и, соответственно, отмечает, что сокет открыт. Потому в родителе ты можешь смело его закрывать.

PS. Я надеюсь, ты в "case 0" не сразу close() ставил, а после какой-то обработки чего-то ? :)
Да, и в потомке нужно делатьт завершение программы.

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

11. "лимит открытых файлов на процесс или на юзверя?"
Сообщение от Arifolth Искать по авторуВ закладки(ok) on 03-Сен-04, 10:54  (MSK)
>Как бы это сказать... Сокет держится открытым до тех пор, пока есть
>хоть один процесс, который с ним работает. fork создает точную копию
>данных родителя и, соответственно, отмечает, что сокет открыт. Потому в родителе
>ты можешь смело его закрывать.
>
>PS. Я надеюсь, ты в "case 0" не сразу close() ставил, а
>после какой-то обработки чего-то ? :)
>Да, и в потомке нужно делатьт завершение программы.

всё, разобрался, пасиба
вопрос закрыт
грабли были в том что у мя написан "собственный" обработчик close() куда в кач-ве параметра передавался указятель =|
при его вызове вобщем закрывалось не то что нужно

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

10. "лимит открытых файлов на процесс или на юзверя?"
Сообщение от klalafuda emailИскать по авторуВ закладки on 02-Сен-04, 18:28  (MSK)
>мне кажется что это не удивительно (хотя есть одно но...) т/ к/
>форкнутый прцесс не сразу начинает работать - проходит какое-то время а
>за это время выполняется close(s) в родителе =|

срочно посетите книжный магазин и купите хорошую книгу по UNIX (для разработчика). могу порекомендовать "UNIX" Робачевского. с такими познаниями в базе вам еще рано пытаться использовать сокеты.

ps: предвещая наезд a'la "сам дурак, типа на пальцах расскажи". не расскажу. тратить свое время на объяснение самых базовых истин "как работает fork() и что при этом происходит" ни один нормальный человек в здравом уме и трезвой памяти вам не станет. для этого есть соотв. прекрасная литература, где все подробно и четко расписано.

pps: таки почитайте. вы получите массу удовольствия и автоматически решение многих вопросов.

// wbr

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

2. "лимит открытых файлов на процесс или на юзверя?"
Сообщение от Arifolth Искать по авторуВ закладки(ok) on 01-Сен-04, 14:34  (MSK)
маленькая поправка:
сперва валиться дочерний процесс на socket()
а при попытке следующего соединения - родительский на accept()
  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

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




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

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