Закрытие / очистка «смешанных» файловых дескрипторов / сокетов - PullRequest
6 голосов
/ 20 сентября 2008

Когда я создаю сокет с помощью accept () и создаю из него FILE с помощью fdopen (), что мне нужно сделать, чтобы все очистить? Нужно ли выполнять fclose () для ФАЙЛА, shutdown () и close () для сокета, или только shutdown () и close () или fclose ()? Если я не выполняю fclose (), нужно ли вручную () указывать FILE?

Ответы [ 3 ]

5 голосов
/ 20 сентября 2008

От человека fdopen:

Дескриптор файла не дублируется и будет закрыт при закрытии потока, созданного функцией fdopen ()

Так что я бы просто использовал fclose (), которая также закрывает основной файловый дескриптор. Я тоже не знаю, нужно ли shutdown ().

3 голосов
/ 20 сентября 2008

С http://opengroup.org/onlinepubs/007908775/xsh/fclose.html

Функция fclose () выполнит close () для файлового дескриптора, который связано с потоком, указанным на по потоку.

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

0 голосов
/ 20 сентября 2008

У вас есть две вещи, которые вам нужно очистить: поток, представленный FILE, и дескриптор файла, представленный сокетом. Сначала нужно закрыть поток, затем дескриптор файла. Таким образом, в общем случае вам потребуется fclose() любых FILE объектов, а затем close() любых файловых дескрипторов.

Лично я никогда не использовал shutdown(), когда хочу убрать за собой, поэтому не могу сказать.

1010 * редактировать * Другие правильно указали, что fdclose() также закроет базовый файловый дескриптор, и поскольку вызов close() для закрытого файлового дескриптора приведет к ошибке, в этом случае вам нужен только fdclose().

...