本文转载自: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. GO 协程 通道实例以及验证SnowFlake算法

    最近项目中使用了SnowFlake算法产生ID,并在实际运行环境下会产生重复ID,所以写了一个Go的程序进行验证,顺便也练习一下Go的协程与通道. 至于GO的协程和通道的基础知识请自行百度. 代码如下 ...

  2. 【PostgreSQL-9.6.3】函数(3)--日期和时间函数

    在PostgreSQL中,DATE.TIME.TIMESTAMP是三种不同的数据类型.DATE表示日期类型,格式为YYYY-MM-DD或YYYYMMDD:TIME表示时间类型,格式为hh:mi:ss: ...

  3. DataTable如何去除重复的行

    两种方法1 数据库直接去除重复select distinct * from 表名去除了重复行distinct 2 对 DataTable直接进行操作DataTable dt=db.GetDt(&quo ...

  4. MyEclipse获取注册码

    最近刚装上MyEclipse,一直弹窗提示注册码过期,开始还能接受,到最后,每发布一个项目便弹窗提醒,顿时感觉烦了,得治理治理这个烦人的注册码,下面是一段自动生成注册名和注册码的代码,只需要直接拿来用 ...

  5. Canopy聚类算法分析

          原文链接:http://blog.csdn.net/yclzh0522/article/details/6839643 Canopy聚类算法是可以并行运行的算法,数据并行意味着可以多线程进 ...

  6. 论vue项目api相关代码的组织方式

    论vue项目api相关代码的组织方式 看了下项目组同事的代码,发现不同项目有不同的组织版本 版本一: ├─apis │ a.api.js │ b.api.js │ b.api.js │ d.api.j ...

  7. 编码的由来,ASCII编码,和字节的形成

    一.编码的由来 计算机只能计算和识别二进制,必须让计算机识别文字,才能和计算机进行交互,彼此也才能通过计算机通信. 由此,有了ASCII编码的诞生,它起始于50年代后期,在1967年定案,是最初美国国 ...

  8. Git 基础教程 之 解决合并冲突

    ①  解决冲突 把Git合并失败的文件手动编辑成我们希望的内容 ②  提交,合并完成 场景: ①  新分支feature1,修改后,add, commit: ②  切回master后,修改后,add, ...

  9. Q&A to prepare interview of HSBC

    1.How do you keep updating lastest IT knowledge? 1).keep an eye on current project technology evetho ...

  10. mysql查询昨天 一周前 一月前 一年前的数据

    mysql 昨天 一周前 一月前 一年前的数据 这里主要用到了DATE_SUB, 参考如下 代码如下: SELECT * FROM yh_contentwhere inputtime>DATE_ ...