linux 套接字文件描述分配的随机性如何?

How random is a linux socket file description assignment?

我正在编写一个 C# 应用程序,使用 netlink 协议(通过 libnl 库)在 Linux.

中与我的无线网卡通信

基本上我是在模仿iw的功能。 在此初始状态下,我想确保初始移植调用结果与调试真实 linux 应用程序时的结果相同。

它们是 - 除了我使用 nl_socket_get_fd 获取套接字文件描述符的结果。调试应用程序总是 return 一个值为 3 的文件描述符,而我的 c# 应用程序外部调用 nl_socket_get_fd 总是 return 26(即使在系统启动后)。

我记得不久前我也尝试过这样做 - 但是模仿了 iwlist(在注意到它现在已被弃用之前)。调试也总是 returned 3(最终调用 libcsocket 函数),而调试我的 C# 端口总是 returned 19.

Socket 的手册页说

socket() creates an endpoint for communication and returns a file descriptor that refers to that endpoint. The file descriptor returned by a successful call will be the lowest-numbered file descriptor not currently open for the process.

我知道文件描述符是“随机”分配的,只是发现它总是 return 以这种或那种方式 运行 相同的数字。

这有什么好担心的吗?这是否表明我移植的代码已经没有按预期工作并且继续前进最终会产生意想不到的结果?

文档说:

The file descriptor returned by a successful call will be the lowest-numbered file descriptor not currently open for the process.

因此,如果您的进程打开了文件描述符 0、1 和 2,但没有打开文件描述符 3,它将 return 3.

如果您的进程打开了文件描述符 0、1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、18, 19、20、21、22、23、24 和 25,但不是 26,它将 return 26.

这是 Linux 中通常分配文件描述符的方式。