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

6
当我使用accept()创建一个套接字,然后使用fdopen()将其转换为FILE类型时,我需要做什么来清理所有内容?我需要在FILE上执行fclose(),在套接字上执行shutdown()和close(),还是只需要在套接字上执行shutdown()和/或close()或fclose()?如果我不执行fclose(),那么我是否需要手动free()文件指针?
3个回答

5

来自fdopen的man手册:

文件描述符没有复制,当通过fdopen()创建的流关闭时,它将被关闭。

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


3

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

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

如果您已经将套接字包装在流中,那么在关闭之前刷新流可能不再有意义。但是我不能保证这一点,因为我不知道是否存在需要shutdown()而不仅仅是close()的用例。


-1
你需要清理两个东西:由FILE表示的流和由套接字表示的文件描述符。你需要先关闭流,然后再关闭文件描述符。因此,通常你需要fclose()任何FILE对象,然后close()任何文件描述符。
就我个人而言,当我想要清理自己的时候,我从来没有使用shutdown(),所以我不能说。

编辑

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

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