gpt4 book ai didi

在 C 中关闭文件描述符(或套接字)

转载 作者:太空宇宙 更新时间:2023-11-04 00:34:43 33 4
gpt4 key购买 nike

我有疑问:当我用 fd = open() 创建文件描述符或用 fd = socket() 创建套接字时,我将它传递到函数 function( fd)close(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 中关闭文件描述符(或套接字),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50277645/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com