关闭/清理“混合”文件描述符/套接字

当我使用accept()创建一个套接字并使用fdopen()从中创建一个FILE时,我需要做些什么来清理所有内容? 我需要在套接字上的FILE,shutdown()和close()上执行fclose(),还是只需要shutdown()和/或close()或fclose()? 如果我不做fclose(),我是否必须手动释放()FILE指针?

来自man fdopen:

文件描述符不是重复的,并且在fdopen()创建的流关闭时将关闭

所以我只使用fclose(),它也会关闭底层文件描述符。 我不知道是否需要shutdown()。

来自http://opengroup.org/onlinepubs/007908775/xsh/fclose.html

fclose()函数将对与stream指向的流关联的文件描述符执行close()。

如果你已经将你的套接字包装在一个流中,那么shutdown()可能就没有意义了,至少在没有先刷新流的情况下也是如此。 但我不会发誓,因为我不知道你想要shutdown()而不是close()没有用处。

您需要清理两件事: FILE表示的流和套接字表示的文件描述符。 您需要先关闭流,然后关闭文件描述符。 因此,通常你需要fclose()任何FILE对象,然后close()任何文件描述符。

就个人而言,当我想要自己清理之后,我从未使用过shutdown() ,所以我不能说。

编辑

其他人已经正确地指出fdclose()也会关闭底层文件描述符,并且因为在close文件描述符上调用close()会导致错误,在这种情况下你只需要fdclose()