Closing/cleaning up “mixed” file descriptors / sockets

坚强是说给别人听的谎言 提交于 2019-12-10 13:32:00

问题


When I create a socket using accept() and make a FILE out of it using fdopen(), what do I have to do to clean everything up? Do I need to do fclose() on the FILE, shutdown() and close() on the socket, or only the shutdown() and or close() or fclose()? If I don't do fclose(), do I have to free() the FILE pointer manually?


回答1:


From man fdopen:

The file descriptor is not dup’ed, and will be closed when the stream created by fdopen() is closed

So I would just use fclose(), which also closes the underlying file descriptor. I don't know whether shutdown() is needed, either.




回答2:


From http://opengroup.org/onlinepubs/007908775/xsh/fclose.html

The fclose() function will perform a close() on the file descriptor that is associated with the stream pointed to by stream.

If you've wrapped your socket in a stream it probably no longer makes sense to shutdown(), at least not without flushing the stream first. But I won't swear to that, because I don't know that there are no uses where you'd want to shutdown() rather than just close().




回答3:


You have 2 things here you need to clean up: the stream represented by FILE and the file descriptor represented by the socket. You need to close the stream first, then the file descriptor. So, in general you will need to fclose() any FILE objects, then close() any file descriptors.

Personally I have never used shutdown() when I want to cleanup after myself, so I can't say.

edit

Others have correctly pointed out that fdclose() will also close the underlying file descriptor, and since calling close() on a close file descriptor will lead to an error, in this case you only need fdclose().



来源:https://stackoverflow.com/questions/108043/closing-cleaning-up-mixed-file-descriptors-sockets

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!