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

时间:2018-05-10 16:40:29

标签: c file sockets

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

1 个答案:

答案 0 :(得分:6)

是的,内核和整个当前进程都知道file descriptor(在Unix系统上,POSIX上,......)。每个process都有自己的文件描述符表和virtual address space

在Linux上,您可以使用proc(5)查询文件描述符和某个进程的虚拟地址空间。对于pid 1234的过程,请使用/proc/1234/fd/& /proc/1234/fdinfo/了解其文件描述符及其表格,/proc/1234/maps& /proc/1234/smaps了解其虚拟地址空间。

因此,如果一个被调用的函数close - 它,你不应该再使用它了。当然,您可以重新激活它(使用其他opensocketdup返回它。

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

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

BTW,我假设是Unix或POSIX(或Linux)系统。我不了解Windows,它的文件描述符和sockets的概念截然不同。