Linux中,通过netlink接收内核消息,获得设备变化的消息,并输出
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <linux/netlink.h>
#include <unistd.h>
static int init_hotplug_sock(void)
{
struct sockaddr_nl snl;
const int buffersize = 16 * 1024 * 1024; //套接字的缓冲大小把?
//int retval;
memset(&snl, 0x00, sizeof(struct sockaddr_nl)); //清空:sockaddr_nl结构体
snl.nl_family = AF_NETLINK;
snl.nl_pid = getpid();
snl.nl_groups = 1;
int hotplug_sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT); //设置网络通信域,PF_NETLINK表示内核通信;数据传输方式,SOCK_DGRAM表示无连接状态消息;表示使用uevent
/* set receive buffersize */
//设置套接字属性?
setsockopt(hotplug_sock, SOL_SOCKET, SO_RCVBUFFORCE, &buffersize, sizeof(buffersize));//被设置的套接字;指定控制套接字的层次;SOL_SOCKET表示可以设置套接字级别;需要访问的选项名;指向缓冲;选项长度
int retval = bind(hotplug_sock, (struct sockaddr *) &snl, sizeof(struct sockaddr_nl)); //待绑定的套接字;绑定在哪里;绑定那个地方的大小;将套接字绑定到sockaddr_nl结构中
printf("-----------------\n");
printf("%d\n",snl.nl_pid);
return hotplug_sock;
}
#define UEVENT_BUFFER_SIZE 2048
int main(int argc, char* argv[])
{
int hotplug_sock = init_hotplug_sock();
printf("==================\n");
while(1)
{
char buf[UEVENT_BUFFER_SIZE*2] = {0};
char a[2];
int len = recv(hotplug_sock, &buf, sizeof(buf), 0);
for(int i=0;i<len;i++)
if(*(buf+i)=='\0')
buf[i]='\n';
printf("%s\n",buf);
}
return 0;
}