问题描述
据我所知,如果您在与 POSIX 相关的系统上创建一个套接字,然后生成一个继承该套接字 fd 的子进程,显然您应该在每个进程中调用 close
在该进程完成后的那个 fd使用它,因为 fd 是内部引用计数,我想引用计数在 fork
上递增,然后 close
再次递减它。
这与 Windows 是否相同,您应该在每个拥有该套接字副本的进程中调用 closesocket
,还是只在一个进程中调用它,当所有进程都使用它?
编辑:标记为与此问题重复的问题是相关的 (Are TCP SOCKET handles inheritable?),因为它表明继承 SOCKET 容易出错,但也表明它仍然是可能的.在这种情况下,如果一个人不顾可能的错误而坚持下去,那么如果这个问题有答案就好了;应该在所有进程中使用一个 closesocket
,还是只使用父进程?
第二次编辑:我相信在the documentation for WSADuplicateSocketA
中回答了这个问题:
进程可以在重复的套接字上调用 closesocket 并且描述符将被释放。然而,底层套接字将保持打开状态,直到最后一个剩余的描述符调用 closesocket。
解决方法
您不应该将 Windows 上的套接字视为文件描述符,因此它们不会以相同的方式被继承。请参阅此链接以获取您问题的完整答案:Are TCP SOCKET handles inheritable?