{"id":1252,"date":"2017-08-20T10:30:06","date_gmt":"2017-08-20T02:30:06","guid":{"rendered":"http:\/\/www.kumouse.com\/?p=1252"},"modified":"2017-08-20T10:41:43","modified_gmt":"2017-08-20T02:41:43","slug":"1252","status":"publish","type":"post","link":"https:\/\/www.kumouse.com\/?p=1252","title":{"rendered":"\u5229\u7528NETLINK\u68c0\u6d4bUSB\u70ed\u63d2\u62d4\u7684C\u8bed\u8a00\u5b9e\u73b0"},"content":{"rendered":"<p>\u505a\u5d4c\u5165\u5f0f\u5f00\u53d1\uff0c\u5c24\u5176\u5728\u7f51\u5173\u3001\u8def\u7531\u5668\u6216\u8005\u5176\u4ed6\u652f\u6301USB\u8bbe\u5907\u7684\u7ec8\u7aef\u4e0a\uff0c\u4e3a\u4e86\u63d0\u9ad8\u7528\u6237\u4f53\u9a8c\uff0c\u6211\u4eec\u5e38\u5e38\u9700\u8981\u652f\u6301\u81ea\u52a8\u8bc6\u522b\u5e76\u6302\u8f7dUSB\u8bbe\u5907\u529f\u80fd\u3002\u67d0\u4e9b\u5e94\u7528\u7a0b\u5e8f\uff0c\u5728\u4f7f\u7528USB\u8bbe\u5907\u7684\u8fc7\u7a0b\u4e2d\uff0c\u4e5f\u5e0c\u671b\u80fd\u591f\u4fa6\u6d4b\u5230USB\u65ad\u5f00\u4e8b\u4ef6\uff0c\u4e0d\u81f3\u4e8e\u67d0\u4e9b\u5de5\u4f5c\u56e0\u4e3aUSB\u5df2\u7ecf\u4e0d\u5b58\u5728\u800c\u767d\u505a\u3002\u5728Linux\u4e0b\uff0c\u6211\u4eec\u4e3b\u8981\u6709\u4e24\u79cd\u529e\u6cd5\u68c0\u6d4bUSB\u70ed\u63d2\u62d4\u3002<br \/>\n\u7b2c\u4e00\u79cd\u4fbf\u662f\u5b9a\u65f6\u68c0\u67e5\/proc\/scsi\/scsi\u6587\u4ef6\uff0c\u8be5\u6587\u4ef6\u5185\u4f1a\u6309\u7167\u6807\u51c6\u683c\u5f0f\u4fdd\u5b58\u7740\u5f53\u524d\u8bbe\u5907\u5185\u6302\u8f7d\u7684\u5b58\u50a8\u4ecb\u8d28\u57fa\u672c\u4fe1\u606f\uff0c\u5982\u679c\u5728PC\u7aef\uff0c\u9664\u4e86\u786c\u76d8\uff08ATA\uff09\u3001\u5149\u9a71\uff08CD-ROM\uff09\u5916\uff0c\u5c31\u662fUSB\u8bbe\u5907\uff08Direct-Access\uff09\u4e86\uff0c\u8f6e\u8be2\u8be5scsi\u6587\u4ef6\uff0c\u68c0\u67e5\u6587\u4ef6\u5185\u662f\u5426\u65b0\u589e\u6216\u51cf\u5c11\u6570\u636e\u4fbf\u53ef\u5b9e\u73b0\u81ea\u52a8\u4fa6\u6d4bUSB\u70ed\u63d2\u62d4\u7684\u6548\u679c\u3002\u4f46\u662f\u8fd9\u79cd\u65b9\u6cd5\u5bf9\u4e8e\u70ed\u63d2\u62d4\uff08hotplug\uff09\u8bbe\u5907\uff0c\u5982U\u76d8\uff0c\u6548\u679c\u5c31\u6ca1\u90a3\u4e48\u7406\u60f3\u4e86\uff0c\u56e0\u4e3a\u6211\u4eec\u4e0d\u77e5\u9053\u8bbe\u5907\u4ec0\u4e48\u65f6\u5019\u63d2\u4e0a\uff0c\u53c8\u662f\u4ec0\u4e48\u65f6\u5019\u88ab\u62d4\u6389\u4e86\uff0c\u53ea\u80fd\u9a8c\u8bc1\u5f53\u524d\u662f\u5426\u5df2\u7ecf\u63d2\u4e0a\u6216\u8005\u5df2\u7ecf\u62d4\u9664\u7684\u4e8b\u5b9e\u3002\u4e8e\u662f\u4fbf\u6709\u4e86\u53e6\u4e00\u79cd\u529e\u6cd5\uff0c\u6211\u4eec\u91c7\u7528\u4e00\u79cd\u7279\u6b8a\u7c7b\u7684\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\uff08\u5957\u7ed3\u5b57\uff09\u4e13\u95e8\u7528\u4e8eLinux\u5185\u6838\u8ddf\u7528\u6237\u7a7a\u95f4\u4e4b\u95f4\u7684\u5f02\u6b65\u901a\u4fe1\uff0c\u8fd9\u79cd\u6280\u672f\u901a\u5e38\u88ab\u6210\u4e3aNETLINK\u3002<br \/>\n\u7531\u4e8eNETLINK\u662flinux\u5185\u7f6e\u529f\u80fd\uff0c\u6240\u4ee5\u4f7f\u7528\u8d77\u6765\u5f88\u7b80\u5355\uff1a\u521b\u5efa\u4e00\u4e2aAF_NETLINK\u534f\u8bae\u65cf\u4e0bNETLINK_KOBJECT_UEVENT\u7c7b\u578b\u7684\u7279\u6b8a\u6587\u4ef6\u63cf\u8ff0\u7b26\uff08\u5957\u7ed3\u5b57\uff09CppLive\uff0c\u7136\u540e\u5229\u7528setsocketopt\u5141\u8bb8\u8be5\u6587\u4ef6\u63cf\u8ff0\u7b26\uff08\u5957\u7ed3\u5b57\uff09\u590d\u7528\u5176\u4ed6\u7aef\u53e3\uff0c\u518d\u5229\u7528band\u51fd\u6570\u5c06\u81ea\u8eab\u8fdb\u7a0b\u7ed1\u5b9a\u5230\u7279\u6b8a\u6587\u4ef6\u63cf\u8ff0\u7b26\uff08\u5957\u7ed3\u5b57\uff09CppLive\uff0c\u6700\u540e\u5229\u7528select\u5728while\u5faa\u73af\u5185\u76d1\u542cCppLive\u662f\u5426\u53ef\u8bfb\uff0c\u5982\u679c\u53ef\u8bfb\u5219\u8c03\u7528recv\u63a5\u6536Linux\u7cfb\u7edf\u5185\u6838\u4f20\u9012\u8fc7\u6765\u7684\u6570\u636e\u5e76\u6253\u5370\u51fa\u6765\uff0c\u8fd9\u4e9b\u8f93\u51fa\u4fbf\u662fUSB\u70ed\u63d2\u62d4\u4fe1\u606f\u3002\u5f53\u7136\u4f60\u4e5f\u53ef\u4ee5\u4e2a\u6027\u5316\u5730\u5904\u7406\u6765\u81ea\u5185\u6838\u7684\u70ed\u63d2\u62d4\u4fe1\u606f\uff0c\u8ba9\u7a0b\u5e8f\u53d8\u5f97\u66f4\u52a0\u667a\u80fd\u4ee5\u53ca\u4eba\u6027\u5316\u3002<\/p>\n<p>\u5229\u7528NETLINK\u68c0\u6d4bUSB\u70ed\u63d2\u62d4\u7684C\u8bed\u8a00\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<div class=\"dp-highlighter\">\n<div class=\"bar\"><\/div>\n<blockquote>\n<ol>\n<li><span class=\"preprocessor\">#include\u00a0&lt;stdio.h&gt;<\/span><\/li>\n<li><span class=\"preprocessor\">#include\u00a0&lt;stdlib.h&gt;<\/span><\/li>\n<li><span class=\"preprocessor\">#include\u00a0&lt;string.h&gt;<\/span><\/li>\n<li><span class=\"preprocessor\">#include\u00a0&lt;fcntl.h&gt;<\/span><\/li>\n<li><span class=\"preprocessor\">#include\u00a0&lt;sys\/socket.h&gt;<\/span><\/li>\n<li><span class=\"preprocessor\">#include\u00a0&lt;linux\/netlink.h&gt;<\/span><\/li>\n<li><span class=\"preprocessor\">#define\u00a0UEVENT_BUFFER_SIZE\u00a02048<\/span><\/li>\n<li><\/li>\n<li><span class=\"datatypes\">int<\/span>\u00a0main(<span class=\"keyword\">void<\/span>)<\/li>\n<li>{<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">struct<\/span>\u00a0sockaddr_nl\u00a0client;<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">struct<\/span>\u00a0timeval\u00a0tv;<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0<span class=\"datatypes\">int<\/span>\u00a0CppLive,\u00a0rcvlen,\u00a0ret;<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0fd_set\u00a0fds;<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0<span class=\"datatypes\">int<\/span>\u00a0buffersize\u00a0=\u00a01024;<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0CppLive\u00a0=\u00a0socket(AF_NETLINK,\u00a0SOCK_RAW,\u00a0NETLINK_KOBJECT_UEVENT);<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0memset(&amp;client,\u00a00,\u00a0<span class=\"keyword\">sizeof<\/span>(client));<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0client.nl_family\u00a0=\u00a0AF_NETLINK;<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0client.nl_pid\u00a0=\u00a0getpid();<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0client.nl_groups\u00a0=\u00a01;\u00a0<span class=\"comment\">\/*\u00a0receive\u00a0broadcast\u00a0message*\/<\/span><\/li>\n<li>\u00a0\u00a0\u00a0\u00a0setsockopt(CppLive,\u00a0SOL_SOCKET,\u00a0SO_RCVBUF,\u00a0&amp;buffersize,\u00a0<span class=\"keyword\">sizeof<\/span>(buffersize));<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0bind(CppLive,\u00a0(<span class=\"keyword\">struct<\/span>\u00a0sockaddr*)&amp;client,\u00a0<span class=\"keyword\">sizeof<\/span>(client));<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">while<\/span>\u00a0(1)\u00a0{<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"datatypes\">char<\/span>\u00a0buf[UEVENT_BUFFER_SIZE]\u00a0=\u00a0{\u00a00\u00a0};<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0FD_ZERO(&amp;fds);<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0FD_SET(CppLive,\u00a0&amp;fds);<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tv.tv_sec\u00a0=\u00a00;<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tv.tv_usec\u00a0=\u00a0100\u00a0*\u00a01000;<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ret\u00a0=\u00a0select(CppLive\u00a0+\u00a01,\u00a0&amp;fds,\u00a0NULL,\u00a0NULL,\u00a0&amp;tv);<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">if<\/span>(ret\u00a0&lt;\u00a00)<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">continue<\/span>;<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">if<\/span>(!(ret\u00a0&gt;\u00a00\u00a0&amp;&amp;\u00a0FD_ISSET(CppLive,\u00a0&amp;fds)))<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">continue<\/span>;<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"comment\">\/*\u00a0receive\u00a0data\u00a0*\/<\/span><\/li>\n<li>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0rcvlen\u00a0=\u00a0recv(CppLive,\u00a0&amp;buf,\u00a0<span class=\"keyword\">sizeof<\/span>(buf),\u00a00);<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">if<\/span>\u00a0(rcvlen\u00a0&gt;\u00a00)\u00a0{<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0printf(<span class=\"string\">&#8220;%s\\n&#8221;<\/span>,\u00a0buf);<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"comment\">\/*You\u00a0can\u00a0do\u00a0something\u00a0here\u00a0to\u00a0make\u00a0the\u00a0program\u00a0more\u00a0perfect!!!*\/<\/span><\/li>\n<li>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0}<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0close(CppLive);<\/li>\n<li>\u00a0\u00a0\u00a0\u00a0<span class=\"keyword\">return<\/span>\u00a00;<\/li>\n<li>}<\/li>\n<\/ol>\n<\/blockquote>\n<\/div>\n<p>\u8fd0\u884c\u7a0b\u5e8f\uff0c\u6d4b\u8bd5U\u76d8\u63d2\u5165\/\u62d4\u9664\uff0c\u8f93\u51fa\u5982\u4e0b\uff1a<\/p>\n<div class=\"dp-highlighter\">\n<ol class=\"dp-cpp\" start=\"1\">\n<li class=\"alt\">add@\/devices\/pci0000:00\/0000:00:1d.7\/usb2\/2-1<\/li>\n<li>add@\/devices\/pci0000:00\/0000:00:1d.7\/usb2\/2-1\/2-1:1.0<\/li>\n<li class=\"alt\">add@\/module\/usb_storage<\/li>\n<li>add@\/devices\/pci0000:00\/0000:00:1d.7\/usb2\/2-1\/2-1:1.0\/host6<\/li>\n<li class=\"alt\">add@\/devices\/pci0000:00\/0000:00:1d.7\/usb2\/2-1\/2-1:1.0\/host6\/scsi_host\/host6<\/li>\n<li>add@\/bus\/usb\/drivers\/usb-storage<\/li>\n<li class=\"alt\">add@\/devices\/pci0000:00\/0000:00:1d.7\/usb2\/2-1\/2-1:1.0\/host6\/target6:0:0<\/li>\n<li>add@\/devices\/pci0000:00\/0000:00:1d.7\/usb2\/2-1\/2-1:1.0\/host6\/target6:0:0\/6:0:0:0<\/li>\n<li class=\"alt\">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<\/li>\n<li>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<\/li>\n<li class=\"alt\">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<\/li>\n<li>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<\/li>\n<li class=\"alt\">change@\/devices\/pci0000:00\/0000:00:1d.7\/usb2\/2-1\/2-1:1.0\/host6\/target6:0:0\/6:0:0:0<\/li>\n<li>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<\/li>\n<li class=\"alt\">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<\/li>\n<li>add@\/devices\/<span class=\"keyword\">virtual<\/span>\/bdi\/8:16<\/li>\n<li class=\"alt\">add@\/module\/fat<\/li>\n<li>add@\/kernel\/slab\/fat_cache<\/li>\n<li class=\"alt\">add@\/kernel\/slab\/fat_inode_cache<\/li>\n<li>add@\/module\/vfat<\/li>\n<li class=\"alt\">add@\/module\/nls_cp437<\/li>\n<li>add@\/module\/nls_iso8859_1<\/li>\n<li class=\"alt\">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<\/li>\n<li>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<\/li>\n<li class=\"alt\">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<\/li>\n<li>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<\/li>\n<li class=\"alt\">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<\/li>\n<li>remove@\/devices\/<span class=\"keyword\">virtual<\/span>\/bdi\/8:16<\/li>\n<li class=\"alt\">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<\/li>\n<li>remove@\/devices\/pci0000:00\/0000:00:1d.7\/usb2\/2-1\/2-1:1.0\/host6\/target6:0:0\/6:0:0:0<\/li>\n<li class=\"alt\">remove@\/devices\/pci0000:00\/0000:00:1d.7\/usb2\/2-1\/2-1:1.0\/host6\/scsi_host\/host6<\/li>\n<li>remove@\/devices\/pci0000:00\/0000:00:1d.7\/usb2\/2-1\/2-1:1.0\/host6<\/li>\n<li class=\"alt\">remove@\/devices\/pci0000:00\/0000:00:1d.7\/usb2\/2-1\/2-1:1.0<\/li>\n<li>remove@\/devices\/pci0000:00\/0000:00:1d.7\/usb2\/2-1<\/li>\n<li class=\"alt\">remove@\/host6\/target6:0:0<\/li>\n<\/ol>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u505a\u5d4c\u5165\u5f0f\u5f00\u53d1\uff0c\u5c24\u5176\u5728\u7f51\u5173\u3001\u8def\u7531\u5668\u6216\u8005\u5176\u4ed6\u652f\u6301USB\u8bbe\u5907\u7684\u7ec8\u7aef\u4e0a\uff0c\u4e3a\u4e86\u63d0\u9ad8\u7528\u6237\u4f53\u9a8c\uff0c\u6211\u4eec\u5e38\u5e38\u9700\u8981\u652f\u6301\u81ea\u52a8\u8bc6\u522b\u5e76\u6302 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-1252","post","type-post","status-publish","format-standard","hentry","category-linux-c"],"_links":{"self":[{"href":"https:\/\/www.kumouse.com\/index.php?rest_route=\/wp\/v2\/posts\/1252","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kumouse.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kumouse.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kumouse.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kumouse.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1252"}],"version-history":[{"count":2,"href":"https:\/\/www.kumouse.com\/index.php?rest_route=\/wp\/v2\/posts\/1252\/revisions"}],"predecessor-version":[{"id":1256,"href":"https:\/\/www.kumouse.com\/index.php?rest_route=\/wp\/v2\/posts\/1252\/revisions\/1256"}],"wp:attachment":[{"href":"https:\/\/www.kumouse.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1252"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kumouse.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1252"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kumouse.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1252"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}