换句话说,在创建新套接字时,系统如何选择整数作为描述符?
如果可以,那么我们就无法在套接字关闭后recv
或send
,因为recv
/ send
可能实际上是旧套接字关闭后,在已创建的套接字上运行(因此不返回错误)。我是对的吗?
在一个程序中,两个线程在同一个套接字上运行,很可能在一个线程关闭套接字后,另一个线程仍尝试recv/send
。
答案 0 :(得分:1)
POSIX specifies how the system allocates file descriptors:
2.14。文件描述符分配
除非另有说明,否则打开一个或多个文件描述符的所有函数应在每次分配时以原子方式分配编号最小的可用(即,在调用进程中尚未打开)文件描述符。在单个函数分配两个文件描述符(例如,
pipe()
或socketpair()
)的情况下,分配可以是独立的,因此应用程序不应期望它们具有相邻值或取决于具有较高值的值。
因此,保证分配文件描述符,关闭它,然后分配另一个文件描述符的进程将重用文件描述符。
您正在描述的一个线程关闭另一个线程也在使用的文件描述符的问题是一个常见的多线程编程错误。您需要通过使用某个应用程序级对象管理文件描述符(内核级对象)来处理它,您可以在其中跟踪该文件是否仍然可以访问被称为文件描述符的对象(套接字,文件等)描述符。