Закрытие/очистка «смешанных» файловых дескрипторов/сокетов
-
01-07-2019 - |
Вопрос
Когда я создаю сокет с помощью Accept() и создаю из него ФАЙЛ с помощью fdopen(), что мне нужно сделать, чтобы все очистить?Нужно ли мне выполнять fclose() для ФАЙЛА, выключение() и close() для сокета или только выключение() и/или close() или fclose()?Если я не выполню fclose(), придется ли мне вручную освобождать() указатель FILE?
Решение
От человека fdopen:
Дескриптор файла не дублируется и будет закрыт при закрытии потока, созданного функцией fdopen().
Поэтому я бы просто использовал fclose(), который также закрывает базовый дескриптор файла.Я также не знаю, нужно ли выключение().
Другие советы
От http://opengroup.org/onlinepubs/007908775/xsh/fclose.html
Функция fclose () выполнит Close () в дескрипторе файла, который связан с потоком, на который указано по потоку.
Если вы обернули сокет в поток, то, вероятно, больше не имеет смысла отключать(), по крайней мере, без предварительной очистки потока.Но я не буду в этом клянусь, потому что не знаю, есть ли случаи, когда вам хотелось бы выключить(), а не просто закрыть().
Здесь вам нужно очистить 2 вещи:поток, представленный FILE
и дескриптор файла, представленный сокетом.Вам нужно сначала закрыть поток, затем дескриптор файла.Итак, в целом вам нужно будет fclose()
любой FILE
объекты, то close()
любые файловые дескрипторы.
Лично я никогда не использовал shutdown()
когда я захочу убрать за собой, поэтому не могу сказать.
редактировать
Другие правильно заметили, что fdclose()
также закроет базовый файловый дескриптор, и поскольку вызов close()
при закрытии файлового дескриптора приведет к ошибке, в этом случае вам нужно только fdclose()
.