Linux kernel 如何在用户空间中使用NETLINK_KOBJECT_UEVENT协议? 让我们考虑这个示例代码: #包括 #包括 #包括 #包括 #包括 #定义BUF_尺寸4096 int main(){ int-fd,res; 无符号整数i,len; 字符大小[buf_SIZE]; 结构sockaddr_nl nls; fd=插座(PF_NETLINK、SOCK_RAW、NETLINK_KOBJECT_UEVENT); 如果(fd==-1){ 返回1; } memset(&nls,0,sizeof(nls)); nls.nl_family=AF_NETLINK; nls.nl_pid=getpid(); nls.nl_组=1; res=bind(fd,(struct sockaddr*)&nls,sizeof(nls)); 如果(res==-1){ 返回2; } 而(1){ len=recv(fd,buf,sizeof(buf),0); printf(“===================接收到%d字节\n”,len); 对于(i=0;i

Linux kernel 如何在用户空间中使用NETLINK_KOBJECT_UEVENT协议? 让我们考虑这个示例代码: #包括 #包括 #包括 #包括 #包括 #定义BUF_尺寸4096 int main(){ int-fd,res; 无符号整数i,len; 字符大小[buf_SIZE]; 结构sockaddr_nl nls; fd=插座(PF_NETLINK、SOCK_RAW、NETLINK_KOBJECT_UEVENT); 如果(fd==-1){ 返回1; } memset(&nls,0,sizeof(nls)); nls.nl_family=AF_NETLINK; nls.nl_pid=getpid(); nls.nl_组=1; res=bind(fd,(struct sockaddr*)&nls,sizeof(nls)); 如果(res==-1){ 返回2; } 而(1){ len=recv(fd,buf,sizeof(buf),0); printf(“===================接收到%d字节\n”,len); 对于(i=0;i,linux-kernel,netlink,Linux Kernel,Netlink,它在netlink套接字上侦听与热插拔相关的事件。基本上,它是有效的。然而,即使花了一整晚的时间在谷歌上搜索、阅读不同的文档和手册以及研究示例,有些部分对我来说还是不清楚 基本上,我有两个问题 sockaddr\u nl.nl\u组的不同值意味着什么?至少适用于NETLINK\u KOBJECT\u UEVENT协议 如果为消息分配的缓冲区太小,消息将被简单地截断(您可以使用BUF_SIZESIZE查看)。为了不丢失任何数据,缓冲区大小应该是多少?是否有可能知道传入消息的用户空间长度以分配足够的

它在netlink套接字上侦听与热插拔相关的事件。基本上,它是有效的。然而,即使花了一整晚的时间在谷歌上搜索、阅读不同的文档和手册以及研究示例,有些部分对我来说还是不清楚

基本上,我有两个问题

  • sockaddr\u nl.nl\u组的不同值意味着什么?至少适用于
    NETLINK\u KOBJECT\u UEVENT
    协议
  • 如果为消息分配的缓冲区太小,消息将被简单地截断(您可以使用
    BUF_SIZE
    SIZE查看)。为了不丢失任何数据,缓冲区大小应该是多少?是否有可能知道传入消息的用户空间长度以分配足够的空间
  • 我希望您能直接回答,作为内核代码的参考

  • 这些值表示不同的多播组。一个netlink套接字可以有31个不同的多播组(0表示单播),多播消息可以发送到这些组。对于
    NETLINK\u KOBJECT\u UEVENT
    而言,它似乎已固定为
    1

  • 您应该能够使用
    级别
    设置为
    SOL\u SOCKET
    optname
    设置为
    SO\u RCVBUF