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
它在netlink套接字上侦听与热插拔相关的事件。基本上,它是有效的。然而,即使花了一整晚的时间在谷歌上搜索、阅读不同的文档和手册以及研究示例,有些部分对我来说还是不清楚 基本上,我有两个问题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查看)。为了不丢失任何数据,缓冲区大小应该是多少?是否有可能知道传入消息的用户空间长度以分配足够的
sockaddr\u nl.nl\u组的不同值意味着什么?至少适用于NETLINK\u KOBJECT\u UEVENT
协议
BUF_SIZE
SIZE查看)。为了不丢失任何数据,缓冲区大小应该是多少?是否有可能知道传入消息的用户空间长度以分配足够的空间NETLINK\u KOBJECT\u UEVENT
而言,它似乎已固定为1
级别设置为SOL\u SOCKET
和optname
设置为SO\u RCVBUF