本文转载自:http://blog.csdn.net/qq_29729577/article/details/50825134

udev是Linux提供的一种在用户态管理设备的一种机制,udev的详细使用方法可参考其他资料,这里推荐http://blog.csdn.NET/fjb2080/article/details/4876314,这里总结一下我在学习过程中对udev的简单应用:

我要实现的是在我的u盘插入时,利用udev实现自动挂载至指定目录,并且实现我想要的相关功能,我的系统是ubuntu14.04:

1.先插入u盘,输入sudo fdisk -l,观察到u盘的信息如下:

设备 启动      起点          终点     块数   Id  系统
/dev/sdb4   *         256    15663103     7831424    b  W95 FAT32

2.在/etc/udev/rules.d下创建文件10-usb.rules,内容如下:

SUBSYSTEM=="block", KERNEL=="sdb4", ACTION=="add", NAME="Myusb", SYMLINK+="Myusb_link", RUN+="/bin/bash /home/usbadd.sh"
SUBSYSTEM=="block", KERNEL=="sdb4", ACTION=="remove",    RUN+="/bin/bash /home/usbremove.sh"

udev规则文件的编写方法可参考udev官方文档,这里对上述内容作简单说明:

当插入设备(ACTION=="add")在kernel中设备名为sdb4(KERNEL=="sdb4"),且为块设备(SUBSYSTEM=="block"),满足以上三个条件时,对设备文件命名为Myusb(NAME="Myusb"),并创建软链接Myusb_link(SYMLINK+="Myusb_link"),同时执行/home/usbadd.sh脚本(RUN+="/bin/bash /home/usbadd.sh")。

其中sdb4就是通过fdisk -l查看得到的,软链接会在/dev下创建,名字可以自定义(以后无论插入任何u盘都可以以同一名字来访问),usbadd.sh脚本中可以编写你想实现的任何内容,我的内容是将u盘挂载到/mnt/usb目录下:

#!/bin/bash
if [ ! -d /mnt/usb ];then
    sudo mkdir -p /mnt/usb
fi
sudo mount /dev/Myusb_link /mnt/usb

当设备拔出时,运行/home/usbremove.sh脚本卸载u盘:

#!/bin/bash
if [ -d /mnt/usb ];then
    sudo umount /mnt/usb
    sudo rm -r /mnt/usb
fi

3.当规则文件和执行脚本编写完成后即可进行测试,我在测试中发现,当插入u盘时,ls /dev/下查看发现u盘设备名依旧为sdb4,Myusb_link软链接指向sdb4,其中原因还有待研究,但是我在CentOS 6.4系统下测试发现,自定义的设备文件名Myusb取代了sdb4。
此外,还可以通过udevadm工具来管理udev,udevadm相关用法见:http://blog.csdn.net/yangzhongxuan/article/details/11113431

4.udev本身是通过netlink与内核进行socket通信的,下面附上一个简单的捕获netlink消息的小程序:

#include <stdio.h>
#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> 
#include <unistd.h> 
#include <arpa/inet.h> 
#include <netinet/in.h>

#define UEVENT_BUFFER_SIZE 2048

static int init_hotplug_sock() 

    const int buffersize = 1024; 
    int ret;

struct sockaddr_nl snl; 
    bzero(&snl, sizeof(struct sockaddr_nl)); 
    snl.nl_family = AF_NETLINK; 
    snl.nl_pid = getpid(); 
    snl.nl_groups = 1;

int s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT); 
    if (s == -1)  
    { 
        perror("socket"); 
        return -1; 
    } 
    setsockopt(s, SOL_SOCKET, SO_RCVBUF, &buffersize, sizeof(buffersize));

ret = bind(s, (struct sockaddr *)&snl, sizeof(struct sockaddr_nl)); 
    if (ret < 0)  
    { 
        perror("bind"); 
        close(s); 
        return -1; 
    }

return s; 
}

int main(int argc, char* argv[]) 

    int hotplug_sock = init_hotplug_sock();

while(1) 
    { 
        /* Netlink message buffer */ 
        char buf[UEVENT_BUFFER_SIZE * 2] = {0}; 
        recv(hotplug_sock, &buf, sizeof(buf), 0); 
        printf("%s\n", buf);

/* USB 设备的插拔会出现字符信息,通过比较不同的信息确定特定设备的插拔,在这添加比较代码 */

}
    return 0; 
}

linux中udev简单的用法-->【转】的更多相关文章

  1. linux中udev简单的用法【转】

    本文转载自:http://blog.csdn.net/qq_29729577/article/details/50825134 udev是Linux提供的一种在用户态管理设备的一种机制,udev的详细 ...

  2. Linux中yum和apt-get用法及区别

    Linux中yum和apt-get用法及区别   一般来说著名的linux系统基本上分两大类:   1.RedHat系列:Redhat.Centos.Fedora等   2.Debian系列:Debi ...

  3. Linux中find命令的用法汇总

    Linux中find命令的用法汇总 https://www.jb51.net/article/108198.htm

  4. linux中memset的正确用法

    linux中memset的正确用法 [起因]希望对各种类型的数组进行初始化,避免野值 [函数头文件] 提示:在linux中可以在terminal中输入 "man memset"进行 ...

  5. linux中find命令高级用法

    前言 在<Linux中的文件查找技巧>一文中,我们已经知道了文件查找的基本方法,今天我们介绍find命令的一些高级使用技巧.它能满足我们一些更加复杂的需求. 查找空文件或空目录 有时候需要 ...

  6. linux中grep命令的用法

    作为linux中最为常用的三大文本(awk,sed,grep)处理工具之一,掌握好其用法是很有必要的. 首先谈一下grep命令的常用格式为:[grep  [选项]  "模式"  [ ...

  7. Linux中的crontab命令用法

    Crontab 在linux中,crontab的用来设置定期执行指定的命令,我们可以用它来指定一些需要重复的事情,Linux系统的用户只需将想要定期要执行的命令序列加到crontab文件中,操作系统即 ...

  8. Linux中的简单命令

    history:打印你输过的命令      1.用户在shell中输入的命令会自动保存到内存缓冲区      2.在退出shell的时候,内存中的数据会刷新到磁盘文件:~/.bash_history ...

  9. linux中的ps命令用法。

    在linux中使用ps命令可以查看有哪些进程在运行和运行的状态.进程是否结束.进程有没有僵尸.哪些进程占用了过多的资源等等. ps命令最常用的是用于监控后台进程的工作情况. 名称:ps 使用权限:所有 ...

随机推荐

  1. Nginx作为负载均衡服务

    负载均衡服务器配置: 注意:upstream和server同级 案例: 建立两个基于端口的虚拟主机来模拟两台web服务器. (1)新建一个www.123.com:81和www.123.com:82的虚 ...

  2. elasticsearch5.3.0 bulk index 性能调优实践

    elasticsearch5.3.0 bulk index 性能调优实践 通俗易懂

  3. JavaScript 判断手机端操作系统(Andorid/IOS)

    androidURL = "http://xxx/xxx.apk"; var browser = { versions: function() { var u = navigato ...

  4. 网上找的JS截取字符串(含中文)

    <script> /* 2007-11-28 XuJian */ //截取字符串 包含中文处理 //(串,长度,增加...) function subString(str, len, ha ...

  5. Arduino 控制超声波测距模块

    一.实物图 二.例子代码 用到数字2 和3 引脚,还有两个就是vcc GND两个阴脚,用模块连线比较简单

  6. 单链表每k个节点一组进行反转(最后不足k个也反转)

    一道面试题,第一次碰到这道题的时候 要求10分钟之内手写代码实现,当时没写出来,后来花点时间把过程梳理一遍,也挺简单的....... 思路就是在原来单链表反转的基础上,加几个控制参数,记录几个关键节点 ...

  7. Linux常见英文报错中文翻译

    Linux常见英文报错中文翻译(菜鸟必知) 1.command not found 命令没有找到 2.No such file or directory 没有这个文件或目录 3.Permission ...

  8. 微信小程序 PDF下载打印

    在开发微信小程序时,需要打印生成的PDF,实现思路是:后端生成相应的PDF,微信小程序下载并打开. 但是微信小程序并不可以打印,所以需要借助其他APP比如:WPS,但是发现微信小程序down的PDF在 ...

  9. 上传菜品数据&生成点餐二维码

    基础数据上传 在门店助手打开数据上传功能,点击上传到微餐厅3.0,,即将门店本地的基础数据上传到线上. 注意1:上传前,需要在线下系统维护好基础数据 注意2:线下基础数据发生更改时,需要手动在门店助手 ...

  10. swift UITableViewCell 中的单选控制样式

    我昨天在网上找了一晚上的资料,但是大多都是OC得语法,swift资料实在是太少了,使得我这个刚入门swift的彩笔好不吃力,后面一直各种翻阅资料,终于让我找到了 visibleCells 这个方法,直 ...