在C中关闭文件描述符(或套接字)

iFe*_*erx 1 c sockets file

我有一个疑问:当我用fd = open()或带有fd = socket()的套接字创建一个文件描述符时,我将它传递给一个函数函数(fd),它关闭(fd),在main中功能,fd仍然可用或不起作用?换句话说,当我关闭按值传递给函数的文件描述符时,它是否也为调用函数关闭?

Bas*_*tch 6

是的,内核和整个当前进程都知道文件描述符(在Unix系统上,POSIX上,......).每个进程都有自己的文件描述符表和虚拟地址空间.

在Linux上,您可以使用proc(5)查询文件描述符和某个进程的虚拟地址空间.对于PID 1234的过程中,使用/proc/1234/fd//proc/1234/fdinfo/了解其文件描述符和他们的桌子,/proc/1234/maps/proc/1234/smaps了解它的虚拟地址空间.

因此,如果一个被调用的函数 - close它,你不应该再使用它了.当然,你可能会重新激活它(与其他一些open,socket,dup它返回).

因此,您需要定义,记录和明确有关close-ing职责的约定(就像您对free指针一样).另请阅读RAII.

在这方面,close有点像free:它使传递给它的值(文件描述符close,指针free)无效.如果可能,您可以在成功关闭(2)后将文件描述符设置为-1(或其他一些无效值)close(fd); fd = -1;,例如代码.出于类似的原因,我也free(ptr), ptr = NULL;尽可能地做.

顺便说一句,我假设是Unix或POSIX(或Linux)系统.我不了解Windows,它有一个非常不同的文件描述符和套接字的概念.

  • FWIW,在Windows上你不能'关闭()`套接字.你必须使用`closesocket()`.请参阅/sf/ask/2480927081/和https://msdn.microsoft.com/en-us/library/windows/desktop/ms737582(v=vs.85 )的.aspx (2认同)