【问题标题】:Closing/cleaning up "mixed" file descriptors / sockets关闭/清理“混合”文件描述符/套接字
【发布时间】:2010-09-11 14:30:27
【问题描述】:

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

【问题讨论】:

    标签: c sockets io file-descriptor


    【解决方案1】:

    来自 man fdopen:

    文件描述符没有被复制,当fdopen()创建的流关闭时会关闭

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

    【讨论】:

      【解决方案2】:

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

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

      如果你已经将你的套接字包装在一个流中,那么shutdown() 可能不再有意义,至少在没有先刷新流的情况下是这样。但我不会发誓,因为我不知道你想要关闭()而不是关闭()的地方没有任何用途。

      【讨论】:

        【解决方案3】:

        这里有两件事需要清理:FILE 表示的流和套接字表示的文件描述符。您需要先关闭流,然后关闭文件描述符。所以,一般来说你需要fclose()任何FILE对象,然后close()任何文件描述符。

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

        编辑

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

        【讨论】:

          猜你喜欢
          • 2012-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-02
          • 1970-01-01
          • 2014-04-25
          • 2012-11-12
          • 2011-03-31
          相关资源
          最近更新 更多