我怀疑: 当我使用 fd = open()或带有 fd = socket()的套接字创建文件描述符时,我将其传递给函数函数( fd) 关闭(fd),在主要功能中, fd 仍然可用或不起作用? 换句话说,当我关闭一个按值传递给函数的文件描述符时,它是否也为调用函数关闭了?
答案 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
- 它,你不应该再使用它了。当然,您可以重新激活它(使用其他open
,socket
,dup
返回它。
因此,您需要定义,记录和明确有关close
责任的约定(就像您对free
指针一样)。另请阅读RAII。
在这方面,close
有点像free
:无效值{close
的文件描述符,free
的指针传递给它。如果可能,您可以在成功close(2)后将文件描述符设置为-1(或其他一些无效值),例如代码close(fd); fd = -1;
。出于类似的原因,我也尽可能free(ptr), ptr = NULL;
。