LINUX.ORG.RU

В линуксе файл дескриптор остается в /proc/<pid>/fd после закрытия сокета

 , ,


0

2

У меня маленькая программа делает 50 соединений к серверу, а по каждому соединению в отдельном треде посылает один реквест, читает респонс и закрывает сокет. И так все повторяется 1000 раз. В результате число коннекшенов показываемых нетстатом и lsof в Mac OS X 10.8.4 выглядит как следует — пилообразно, а в линуксе у меня lsof чето не работает но прога runs out of file descriptors. В /proc/<pid>/fd на каждой итерации добавляется по 50 дескрипторов а старые никуда не исчезают. Есть идеи в чем дело? Код на хаскеле, но могу показать если интересно.


Ответ на: комментарий от qnikst

iterStream возвращает iter и onum которые закрывают файл сами по концу файла или эксепшену. Iterated вообще удобная io model для хаскеля, а iterio просто единственная имплементации с которой я знаком, её мой знакомый профессор написал.

nokachi
() автор топика
Ответ на: комментарий от nokachi

и с threaded без не воспроизводится. какая версия ghc?

qnikst ★★★★★
()
Ответ на: комментарий от nokachi

знаком со стендфордцами? прикольно.

и ещё попробуй у себя без SSL т.к. я тестил без него, если там поведение будет правильное, то будет понятно, куда копать дальше..

Я только conduit и чистые iteratee пользовал. Надо бы на досуге pipes осилить :).

qnikst ★★★★★
()
Ответ на: комментарий от gh0stwizard

close() просто закрывает fd, shutdown() явно посылает в сокет fin.

AFAIK, close() тоже посылает FIN.

gv
()
Ответ на: комментарий от mashina

close() не запустит shutdown(fd, SHUT_RDWR) если ресурс fd ещё где-то используется - через fdup() или в форкнутом/родительском процессе.

А, ясно, спасибо.

gv
()
Ответ на: комментарий от gh0stwizard

Использовать SO_LINGER нужно только тогда, когда клиент/сервер написаны криво и не умеют закрывать сокеты одновременно. Т.е. один из них игнорирует посылку fin ack.

Кстати да.

ТС, может быть сервер не мониторит состояние сокетов и не закрывает их, когда дургой конец закрыл клиент.

gv
()
Ответ на: комментарий от gv

В си? Ок, буду знать. Вообще, судя по описанию не должен, следовательно, надо еще тестить во бсдшках. Там у них стек другой малость.

gh0stwizard ★★★★★
()
Ответ на: комментарий от gh0stwizard

В си? Ок, буду знать. Вообще, судя по описанию не должен, следовательно, надо еще тестить во бсдшках. Там у них стек другой малость.

C, Linux. AFAIK правильные BSD-сокеты должны так делать, но пруфа нет.

Еще в вики написано:

On SVR4 systems use of close() may discard data. The use of shutdown() or SO_LINGER may be required on these systems to guarantee delivery of all data.

gv
()
Ответ на: комментарий от gh0stwizard

close(), как штатный механизм закрытия любых дескрипторов, закрывает сокеты корректно, и было бы странно, если бы он этого не делал, не находите? Необходимость использовать shutdown() возникает достаточно редко.

Sorcerer ★★★★★
()
Ответ на: комментарий от qnikst

Я сам стэнфордец :-) Попробую без SSL, сейчас нет компа.

nokachi
() автор топика
Ответ на: комментарий от gh0stwizard

Удобно, но не юниксвейно.

Когда это принцип «Всё есть файл» стал не соответствовать юниксвею?

Тут ни слова.

Лучше сначала читать posix, а потом уже линуксовые маны.

Sorcerer ★★★★★
()
Ответ на: комментарий от qnikst

проблема оказалась внутри iterSSL, довольно смешная. Там было как-то так

SSL.shutdown ssl SSL.Bidirectional 
`catch` \(e::IOError) -> unless (notErr e) (ioError e)
`finally` Net.sClose sock

ну и по-видимому файналли и закрытие сокета оказались внутри лябмды. Скобки вокруг лябмбды решили проблему, надо Дэйву или Амиту написать чтобы пофиксили.

nokachi
() автор топика
Ответ на: комментарий от nokachi

ага, вижу.

ну естестевенно, что zap `qux` \x -> foo `bar` baz == qux (zap) (\x -> bar foo baz).

Сам обычно лямбды в обязательном порядке в скобки заключаю.

Поздравляю :)

qnikst ★★★★★
()

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

Результат был вполне предсказуем, это же очевидно.

anonymous
()
Ответ на: комментарий от anonymous

да пофиксили уже баг, успокойся. Нормальный язык, не хуже других. Если разберешься с iteratee-based IO, поймешь почему в нем ресурсы не должны течь.

nokachi
() автор топика
Ответ на: комментарий от nokachi

да пофиксили уже баг, успокойся. Нормальный язык, не хуже других. Если разберешься с iteratee-based IO, поймешь почему в нем ресурсы не должны течь.

Этот топик показывает, что ресурсы таки текут 8).

Deleted
()
Ответ на: комментарий от Deleted

ну так кода без багов не бывает :) но хорошо что можно так структурировать код что заткнешь лик в одном месте, и снова все окей.

nokachi
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.