6

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

4

3 回答 3

5

来自 man fdopen:

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

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

于 2008-09-20T12:48:51.597 回答
3

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

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

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

于 2008-09-20T12:53:58.200 回答
-1

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

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

编辑

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

于 2008-09-20T12:44:59.577 回答