![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Zerstroer |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: 1 Всего: 3 |
Здравствуйте, уважаемые!
Достаточно давно и не спеша пишу приложение на "pure" C под Linux. Предварительная история болезни: Общий алгоритм работы такой: В бесконечном цикле: 1. через popen я вызываю внешний fping я пингую устройство, делаю pclose. 2. создаю сетевое соединение к устройству (через socket и connect), опрашиваю его, получаю данные, закрываю сетевое соединение (через close) 3. после чего через pipe и fork - передаю данные во внешнее приложение и получаю обратно от него результат так же через pipe. Все pipe старательно закрываю при завершении использования в каждом из потоков порожденном fork. И так далее по кругу в бесконечном цикле. В определенный момент через длительный период после запуска, при попытке создать pipe приложение падает с ошибкой "Too many open files". (получил из errno при создании pipe). Воспользовавшись вот этим материалом я получаю дамп открытых файловых дескрипторов на момент падения следующего вида:
Из чего следует, что, судя по всему, у меня длительное время не закрывались сокеты сетевого соединения. Но, сокеты я регулярно закрываю после использования и в случае ошибок с помощью close().
Подскажите, в какую сторону можно копать? С чем может быть связана эта ситуация? Дополнительная информация, которая может помочь. 1. Создаю я сокеты вот так:
2. У меня уже возникал вопрос, который я задавал на форуме, связанный с тем, как методически верно следует идетифицировать закрытый сокет. 3. Я не использую setsockopt и SO_REUSEADDR - может ли быть ошибка связана с этим? -------------------- In silico |
||||||
|
|||||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Гм. Я лично вижу другую картину: Где здесь закрытие сокета перед возвратом EC_NO_SUCH_HOST? Аналогично с connect: В случае ошибки сокет не закрывается. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
Zerstroer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: 1 Всего: 3 |
feodorv, отлично!
Спасибо! Мне очень не хватало свежего взгляда. Своими глазами, я этот код уже замылил. Я так понял, что неоткрывшийся или ошибочно созданный сокет можно закрывать без проблем? Не вывалится ли errno = EBADF "The filedes argument is not a valid file descriptor." ? Это сообщение отредактировал(а) Zerstroer - 13.11.2015, 10:38 -------------------- In silico |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
||||
|
||||
Zerstroer |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: 1 Всего: 3 |
xvr, у меня в createSocket() 3 "аварийных" выхода из функции создания сокета:
1.
2.
3.
Случаи №2 и №3 у меня никаких вопросов не вызывают, в них я действительно прошляпил закрытие сокета при аварийном случае. Мне не ясно с ситуацией №1 - должен ли я вызывать close(socket), если зафейлилось его создание? Что меня сбивает с панталыку: На википедии, есть статья "Сокеты Беркли". В ней, в разделе "Высвобождение ресурсов" написано следующее:
Откуда у меня вопросы: А) В соответствии с путём исполнения когда socket() - выдал ошибку, должен ли я вызвать close()? Б) Сокеты Беркли и то, что мы здесь обсуждаем (Сокеты в Линукс) - это одно и то же? -------------------- In silico |
||||||||
|
|||||||||
feodorv |
|
||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
А что именно Вы хотите закрывать в этом случае? Файловый дескриптор -1? Сокет не создан, соответственно, закрывать нечего. Ну, имелось в виду:
Скажите, если где-нибудь будет написано так:
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||||||||
|
|||||||||||||
Zerstroer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: 1 Всего: 3 |
feodorv, спасибо за ответ.
Я не хочу, что бы казалось, будто бы я оправдываюсь, но, я не стесняюсь задавать настолько глупые вопросы с очевидными ответами, после которых я глупо выгляжу. Формулировка в Википедии вносила малую толику сомнений, за которые я зацепился и задал этот вопрос. Я вообще, очень много сомневаюсь. Я понимаю, что вопрос глупый и я бесконечно благодарен Вам за время, потраченное на ответ. Спасибо. А форум мне всегда помогает, даже задавая здесь вопрос, зачастую, я при формулировке проблемы нахожу ответ. Продолжаю удивляться тому, что Винград продолжает в своём собственном ритме успешно функционировать... Вот такой сентиментальный оффтоп получился. По поводу задачи: Отправил на тестирование, по итогам либо задам возникшие вопросы, либо помечу тему как решенную. -------------------- In silico |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Zerstroer, нет, я не хотел Вас задеть, просто вот прослеживается такая аналогия между socket() и fopen(), которую можно учесть при принятии решения. А в Интернете очень много чего пишут, много полезного, много неточного и бестолкового, к сожалению, не всегда есть возможность во всём этом разобраться. Задавайте вопросы, не стесняйтесь, форум для этого и создан
![]() -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |