下面的例子可以监听内核的hotplug事件,源代码如下:
复制代码 代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<sys/un.h>
#include<sys/ioctl.h>
#include<sys/socket.h>
#include<linux/types.h>
#include<linux/netlink.h>
#include<errno.h>
#defineUEVENT_BUFFER_SIZE2048
staticintinit_hotplug_sock(void);
intmain(intargc,char*argv[])
{
inthotplug_sock=init_hotplug_sock();
while(1){
charbuf[UEVENT_BUFFER_SIZE*2]={0};
recv(hotplug_sock,&buf,sizeof(buf),0);
printf("%sn",buf);
}
return0;
}
staticintinit_hotplug_sock(void)
{
structsockaddr_nlsnl;
constintbuffersize=16*1024*1024;
intretval;
memset(&snl,0x00,sizeof(structsockaddr_nl));
snl.nl_family=AF_NETLINK;
snl.nl_pid=getpid();
snl.nl_groups=1;
inthotplug_sock=socket(PF_NETLINK,SOCK_DGRAM,NETLINK_KOBJECT_UEVENT);
if(hotplug_sock==-1){
printf("errorgettingsocket:%s",strerror(errno));
return-1;
}
/*setreceivebuffersize*/
setsockopt(hotplug_sock,SOL_SOCKET,SO_RCVBUFFORCE,&buffersize,sizeof(buffersize));
retval=bind(hotplug_sock,(structsockaddr*)&snl,sizeof(structsockaddr_nl));
if(retval<0){
printf("bindfailed:%s",strerror(errno));
close(hotplug_sock);
hotplug_sock=-1;
return-1;
}
returnhotplug_sock;
}