Как закрыть сокет(), если я использовал fdopen() в дескрипторе сокета

Если я создам сокет

sockfd = socket(...);

а затем я связываю его с потоком FILE, вызывая

FILE* f=fdopen(sockfd,"r+");

Должен ли я вызывать и close(sockfd);, и fclose(f); или только close(sockfd);? Что произойдет со структурой FILE, если я вызову fclose(f) или нет?

И (самое главное), если я должен вызвать их обоих, в каком порядке их нужно вызывать? Сначала close() или fclose()?


person kanito73    schedule 07.02.2019    source источник
comment
Вопрос, который я пометил как оригинальный, конкретно не ссылается на сокеты и имеет длинную прелюдию, но вопрос тот же (как закрыть FD, завернутые в fdopen?), и ответ тот же (fclose закрывает как FILE*, так и основной ФД).   -  person zneak    schedule 07.02.2019


Ответы (1)


fdopen() заключает дескриптор файла в буферизованную структуру ввода-вывода FILE, точно так же, как вы открыли ее с помощью fopen().

Вы должны вызвать только fclose(), это закроет дескриптор файла os и освободит все связанные структуры и буферы!

person Ctx    schedule 07.02.2019
comment
@ScottFranco Тогда это будет ошибкой. Из справочной страницы: The fclose() function flushes the stream pointed to by stream (writing any buffered output data using fflush(3)) and closes the underlying file descriptor. - person Ctx; 04.10.2019