【发布时间】:2021-12-06 07:53:49
【问题描述】:
我正在编写一个 C# 应用程序,在 Linux 中使用 netlink 协议(通过 libnl 库)与我的无线网卡进行通信。
基本上我在模仿iw 的功能。
在这个初始状态下,我想确保初始移植调用结果与调试真实 linux 应用时的结果相同。
它们是 - 除了我使用nl_socket_get_fd 获取套接字文件描述符得到的结果。调试应用程序始终返回值为 3 的文件描述符,而我的 c# 应用程序外部调用 nl_socket_get_fd 始终返回 26(即使在系统启动后)。
我记得不久前我也尝试过这样做 - 但模仿 iwlist 代替(在注意到它现在已被弃用之前)。调试也总是返回 3(最终调用 libc 的 socket 函数),而调试我的 C# 端口总是返回 19。
Socket 的手册页说
socket() 创建一个通信端点并返回一个文件 指向该端点的描述符。 文件描述符 成功调用返回的将是编号最小的文件 当前没有为进程打开描述符。
我知道文件描述符是“随机”分配的,只是发现它在以这种或那种方式运行时总是返回相同的数字很可疑。
这有什么好担心的吗?这是否表明我移植的代码已经无法按预期工作,继续前进最终会产生意想不到的结果?
【问题讨论】:
-
它说它将返回尚未使用的最小数字。因此,可能在 iw 运行时使用 0 1 和 2,而在 C# 运行时使用更多(例如加载 C# 库)...
-
所以我认为假设我的系统每次都使用相同的 N 个进程启动是正确的,如果我总是在不打开任何其他程序的情况下进行调试,我应该总是得到相同的文件描述符 - 并且 - 调试真正的应用程序与我移植的应用程序 - 永远不会返回相同的文件描述符?
-
与其他进程无关,与你的进程打开的文件描述符的数量有关。
-
我正在尝试详细说明有关分配自然文件描述符的“确定性”声明。对,与打开的进程无关,而是与打开的文件描述符的数量(由现有进程)有关。所以,换个说法:假设在启动我的系统后的任何给定时间打开的文件描述符的数量,而不启动任何其他程序,似乎是安全的 - 应该是恒定的(对于 any这可能不是真的> 给定时间,可能会有一些操作可能会改变这一点,但理论上听起来一般是正确的?
标签: linux sockets file-descriptor netlink