我有一个疑问:当我用fd = open()或带有fd = socket()的套接字创建一个文件描述符时,我将它传递给一个函数函数(fd),它关闭(fd),在main中功能,fd仍然可用或不起作用?换句话说,当我关闭按值传递给函数的文件描述符时,它是否也为调用函数关闭?
是的,内核和整个当前进程都知道文件描述符(在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,它有一个非常不同的文件描述符和套接字的概念.