проблема с закрытием сокетов - PullRequest
0 голосов
/ 17 марта 2010

Я пытаюсь написать клиент / серверную программу с потоками. Я закрываю розетку, когда соединение закончено. Серверы получают множество новых соединений, и номер сокета (дескриптор файла) очень быстро увеличивается: после 5 минут работы я уже был на уровне дескриптора файла 800!

Это нормально? Разделяют ли потоки файловые дескрипторы? Когда я делаю close(sockfd);, номер освобождается сразу или через некоторое время?

PS: я имел обыкновение делать с fork (), и у меня не было этой проблемы. Спасибо

Ответы [ 2 ]

2 голосов
/ 17 марта 2010

С pthreads(7):

POSIX.1 также требует, чтобы потоки разделяли диапазон других атрибуты (т. е. эти атрибуты являются общими для всего процесса, а не для каждого потока):

  • дескрипторы открытых файлов
1 голос
/ 17 марта 2010

файловые дескрипторы являются общими для всех потоков, поэтому закрытие его в одном потоке закрывает его для всех остальных потоков. close () освобождает fd при возврате вызова (если не происходит ошибка)

Обратите внимание, что close может вернуть ошибку:

Не проверка возвращаемого значения close является распространенной, но, тем не менее, серьезной ошибкой программирования. Вполне возможно, что ошибки в предыдущей операции write (2) сначала сообщаются при финальном закрытии. Не проверяя возврат Значение при закрытии файла может привести к потере данных без вывода сообщений. Это особенно заметно при использовании NFS и дисковых квот.

Проверьте, не использует ли ваш дескриптор файла другие сокеты, возможно, вы пропускаете fds в другом месте - например, если вы открываете нормальные файлы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...