linux c检测USB热插拔(netlink)
2016-02-19 09:43
浏览(13)
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <sys/socket.h> #include <linux/netlink.h> #define UEVENT_BUFFER_SIZE 2048 int main(void) { struct sockaddr_nl client; struct timeval tv; int CppLive, rcvlen, ret; fd_set fds; int buffersize = 1024; CppLive = socket(AF_NETLINK, SOCK_RAW, NETLINK_KOBJECT_UEVENT); memset(&client, 0, sizeof(client)); client.nl_family = AF_NETLINK; client.nl_pid = getpid(); client.nl_groups = 1; /* receive broadcast message*/ setsockopt(CppLive, SOL_SOCKET, SO_RCVBUF, &buffersize, sizeof(buffersize)); bind(CppLive, (struct sockaddr*)&client, sizeof(client)); while (1) { char buf[UEVENT_BUFFER_SIZE] = { 0 }; FD_ZERO(&fds); FD_SET(CppLive, &fds); tv.tv_sec = 0; tv.tv_usec = 100 * 1000; ret = select(CppLive + 1, &fds, NULL, NULL, &tv); if(ret < 0) continue; if(!(ret > 0 && FD_ISSET(CppLive, &fds))) continue; /* receive data */ rcvlen = recv(CppLive, &buf, sizeof(buf), 0); if (rcvlen > 0) { printf("%s\n", buf); /*You can do something here to make the program more perfect!!!*/ } } close(CppLive); return 0; }
示例输出:
view plaincopy to clipboardprint? add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1 add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0 add@/module/usb_storage add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6 add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/scsi_host/host6 add@/bus/usb/drivers/usb-storage add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0 add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0 add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/scsi_disk/6:0:0:0 add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/scsi_device/6:0:0:0 add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/scsi_generic/sg2 add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/bsg/6:0:0:0 change@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0 add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/block/sdb add@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/block/sdb/sdb4 add@/devices/virtual/bdi/8:16 add@/module/fat add@/kernel/slab/fat_cache add@/kernel/slab/fat_inode_cache add@/module/vfat add@/module/nls_cp437 add@/module/nls_iso8859_1 remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/bsg/6:0:0:0 remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/scsi_generic/sg2 remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/scsi_device/6:0:0:0 remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/scsi_disk/6:0:0:0 remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/block/sdb/sdb4 remove@/devices/virtual/bdi/8:16 remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0/block/sdb remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/target6:0:0/6:0:0:0 remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6/scsi_host/host6 remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host6 remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0 remove@/devices/pci0000:00/0000:00:1d.7/usb2/2-1 remove@/host6/target6:0:0
源地址:
http://www.cpplive.com/html/1355.html