我有个疑问:
当我创建带有 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,则不应再使用它。当然,您可以重新激活它(使用其他一些open
,socket
和dup
返回它)。
因此,您需要定义,记录和明确表示有关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/