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

时间:2008-09-20 12:38:22

标签: c sockets io file-descriptor

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

3 个答案:

答案 0 :(得分:5)

来自man fdopen:

  

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

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

答案 1 :(得分:3)

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

  

fclose()函数将执行a   close()在文件描述符上   与指向的流相关联   按流。

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

答案 2 :(得分:-1)

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

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

修改

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