Закрытие/очистка «смешанных» файловых дескрипторов/сокетов

StackOverflow https://stackoverflow.com/questions/108043

  •  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().

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top