如何关闭一个套接字(socket),如果我在套接字描述符上使用了fdopen()函数?

3
如果我创建一个套接字。
sockfd = socket(...);

然后我通过调用一个函数将其关联到一个FILE流

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

我应该同时调用close(sockfd);fclose(f);吗?如果我调用或不调用fclose(f)会发生什么?
如果需要调用两者,它们的顺序应该是先close()还是fclose()
注:其中 close(sockfd); 关闭套接字连接,fclose(f);关闭文件流。

我标记为原始的问题并没有特别提到套接字,并且有一个很长的序言,但是问题是相同的(“如何关闭包装在fdopen中的FD?”),答案也是相同的(fclose关闭FILE*和底层FD)。 - zneak
1个回答

2

fdopen()函数将文件描述符包装成缓冲的io FILE结构,就像你使用fopen()打开文件一样。

你只需要调用fclose()函数,它会关闭操作系统文件描述符并释放所有相关的结构和缓冲区。

注意:本文中的“文件描述符”指的是一个整数值,用于标识打开的文件。而“操作系统文件描述符”指的是操作系统内核为每个打开的文件分配的唯一标识符。


@ScottFranco 那么这就是一个 bug。根据 manpage 的描述:fclose() 函数将刷新由 stream 指向的流(使用 fflush(3) 写入任何缓冲输出数据),并关闭底层文件描述符。 - Ctx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接