如何解决线程中的netlink套接字:nl_pid的值
我正在尝试在netlink
中使用pthread
套接字。我在Google上搜索了一些示例,其中大多数使用以下模式来标识套接字的“本地”端:
struct sockaddr_nl local = {};
local.nl_family = AF_NETLINK;
local.nl_pid = pthread_self() << 16 | getpid();
...
ret = bind(fd,(struct sockaddr*)&local,sizeof(local));
...
据我了解,通常每个进程打开一个netlink套接字时,nl_pid设置为0,内核将选择正确的portid。但是,对于每线程netlink情况并非如此,其中PID
值将在所有线程之间共享。
此外,我认为pthread_self() << 16 | getpid()
不可移植。在这种情况下设置nl_pid的正确方法是什么?
解决方法
据我了解,通常每个进程打开一个netlink套接字时, nl_pid设置为0,内核将选择正确的portid。然而 对于每线程netlink,PID值为 在所有线程之间共享。
没有“正确的” portid。用进程ID标识端口ID是一种约定,与内核分配端口ID而不是规则时的默认行为一致。无论是单线程还是多线程应用程序,都可以在允许的端口ID范围内自由请求任意端口ID。
此外,当一个进程(无论是单线程还是多线程)绑定多个netlink套接字并将Portid选择委托给内核时,可以依靠内核为每个进程分配唯一的Portid。
此外,我认为
pthread_self() << 16 | getpid()
不可移植。
您是正确的。为了使它在一般情况下具有明确定义的行为,pthread_t
(返回类型pthread_self()
)必须是无符号整数类型,但POSIX甚至要求它不是整数,尽管有签名。
Netlink是特定于Linux的,并且确实限制了您需要关注的范围。仍然有不止一种用于Linux的pthreads实现,将来可能会有新的实现,并且由于未指定此细节,可以想象实现会在版本之间改变类型。
在这种情况下设置nl_pid的正确方法是什么?
我要说的是,选择netlink portid的最佳选择几乎总是让内核分配它们,正如您在评论中总结的那样。包括在单线程应用程序中。但是,这不是进程的文件描述符表的问题,因为端口ID不是文件描述符。特别是,与文件描述符不同,Portid是系统范围的。这就是让内核选择的更多原因。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。