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

最佳答案

是的,内核和整个当前进程都知道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 -s,则不应再使用它。当然,您可以重新激活它(使用其他一些opensocketdup返回它)。

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

在那个方面,close有点像free:它使传递给它的值(close的文件描述符,free的指针)无效。如果可能,您可以在close(2)成功之后将文件描述符设置为-1(或其他无效值),例如,将代码close(fd); fd = -1;设置为。出于类似的原因,我也会在可能的情况下执行free(ptr), ptr = NULL;

顺便说一句,我假设是Unix或POSIX(或Linux)系统。我不知道Windows,它具有文件描述符和sockets的非常不同的概念。

关于c - 在C中关闭文件描述符(或套接字),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50277645/

10-11 15:32