浅尝辄止35-用户程序监听热插拔事件

对于系统的热插拔事件,内核可以自动地帮我们做很多事情。如果我想做一个能够知道热插拔发生的用户软件该怎么实现呢?

手册

netlink(7)

浅尝

有不少很low的方法,例如定时访问有没有新的设备文件被内核建立,本文肯定不是讲这种的。
最近了解到了一个叫NETLINK的东西,它使我们可以通过socket编程直接获取操作系统上报的热插拔事件。

代码演示

#include <stdio.h> 
#include <stdlib.h>  
#include <string.h>
#include <asm/types.h>
#include <sys/socket.h>
#include <linux/netlink.h>
#include <errno.h>

int main(int argc, char **argv)  
{
    int ret, buffersize = 1024;
    int fd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
    struct sockaddr_nl nl;
    memset(&nl, 0, sizeof(struct sockaddr_nl));
    nl.nl_family = AF_NETLINK;  
    nl.nl_pid = getpid();  
    nl.nl_groups = 1;  
    if (fd < 0)   
    {  
        printf("error@%d, %s\n", __LINE__, strerror(errno)); 
        exit(EXIT_FAILURE);  
    }
    ret = bind(fd, (struct sockaddr *)&nl, sizeof(struct sockaddr_nl));
    setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &buffersize, sizeof(buffersize));

    while(1)
    {
        char buf[1024] = {0};
        recv(fd, &buf, sizeof(buf), 0);
        printf("%s\n", buf);
    }
    return 0;  
}

输出

插入优盘

add@/devices/soc0/soc.1/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1.2
add@/devices/soc0/soc.1/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1.2/1-1.2:1.0
add@/devices/soc0/soc.1/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1.2/1-1.2:1.0/host1
add@/devices/soc0/soc.1/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1.2/1-1.2:1.0/host1/scsi_host/host1
add@/devices/soc0/soc.1/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1.2/1-1.2:1.0/host1/target1:0:0
add@/devices/soc0/soc.1/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1.2/1-1.2:1.0/host1/target1:0:0/1:0:0:0
add@/devices/soc0/soc.1/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1.2/1-1.2:1.0/host1/target1:0:0/1:0:0:0/scsi_disk/1:0:0:0
add@/devices/soc0/soc.1/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1.2/1-1.2:1.0/host1/target1:0:0/1:0:0:0/scsi_device/1:0:0:0
add@/devices/virtual/bdi/8:0
add@/devices/soc0/soc.1/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1.2/1-1.2:1.0/host1/target1:0:0/1:0:0:0/block/sda
add@/devices/soc0/soc.1/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1.2/1-1.2:1.0/host1/target1:0:0/1:0:0:0/block/sda/sda1

拔出优盘

remove@/devices/soc0/soc.1/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1.2/1-1.2:1.0/host1/target1:0:0/1:0:0:0/scsi_device/1:0:0:0
remove@/devices/soc0/soc.1/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1.2/1-1.2:1.0/host1/target1:0:0/1:0:0:0/scsi_disk/1:0:0:0
remove@/devices/soc0/soc.1/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1.2/1-1.2:1.0/host1/target1:0:0/1:0:0:0/block/sda/sda1
remove@/devices/virtual/bdi/8:0
remove@/devices/soc0/soc.1/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1.2/1-1.2:1.0/host1/target1:0:0/1:0:0:0/block/sda
remove@/devices/soc0/soc.1/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1.2/1-1.2:1.0/host1/target1:0:0/1:0:0:0
remove@/devices/soc0/soc.1/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1.2/1-1.2:1.0/host1/target1:0:0
remove@/devices/soc0/soc.1/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1.2/1-1.2:1.0/host1/scsi_host/host1
remove@/devices/soc0/soc.1/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1.2/1-1.2:1.0/host1
remove@/devices/soc0/soc.1/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1.2/1-1.2:1.0
remove@/devices/soc0/soc.1/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1.2

瞎分析

输出中有/devices/virtual/bdi/8:0/block/sda/block/sda/sda1,我想他们分别是后备设备、块设备文件、对应块设备的第一个分区的块设备文件。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 4,355评论 0 5
  • ping 出现 dup! 解决方案: udev 详解 如果你使用Linux比较长时间了,那你就知道,在对待设备文件...
    小灰灰1999阅读 339评论 0 0
  • 转自,格式做了调整。 如果你使用Linux比较长时间了,那你就知道,在对待设备文件这块,Linux改变了几次策略。...
    mikeliuy阅读 8,050评论 0 1
  • 转载自:http://blog.csdn.net/hguisu/article/details/6122513原作...
    miaoiao阅读 1,639评论 0 7
  • 这一次宣传活动,我们尝试了网络直播方式,六个社区近两百人同时进行活动,以直播方式向居民普及新的项目正式启动,在这个...
    三月小女子23点前睡觉阅读 241评论 0 0

友情链接更多精彩内容