目录
UDEV通俗的讲也叫热拔插机制,本质上是Linux系统内核自带的一个保护进程,用于自动对于插入该系统的设备进行管理,也就是设备文件的生成和删除。
UDEV通俗的讲也叫热拔插机制,本质上是Linux系统内核自带的一个保护进程,用于自动对于插入该系统的设备进行管理,也就是设备文件的生成和删除。
1.UDEV运行的流程:
a.UDEV是个守护进程(守护进程后面有讲解),在进程中会周期的监听内核的uevent,也就是内核对于设备进行了哪些ACTION(add/remove)
b.识别到该操作之后,udev会在对应系统文件 /etc/udev/rule.d/ 中寻找.rule的对应规则文件
c.正确识别到对应文件之后,对其对应的设备文件进行添加或者删除。
2.守护进程
守护进程是一种特殊的进程,有很多五花八门的特点。对于它的理解主要归纳为两个特点就行:
1.时常运行,并且不需要依托终端控制台也会存在
2.其父进程pid是1,也就是被init进程回收了。本质上符合孤儿进程。
注意:守护进程和后台进程是不一样的!
1. 守护进程和终端不挂钩;后台进程能往终端上输出东西(和终端挂钩);
2. 守护进程关闭终端时不受影响,守护进程不会随着终端的退出而退出;
另外,其实我们是可以自己手动开发一个守护进程的,比如我们可以写一个在后台运行的为了防止某进程中途崩溃的守护进程,我们只需要知道一个API就行:
#include <unistd.h>
int daemon(int nochdir, int noclose);
函数参数:
nochdir:为0时表示将当前目录更改至“/”
noclose:为0时表示将标准输入、标准输出、标准错误重定向至“/dev/null”
返回值:
则返回0,失败返回-1
这函数只需要知道它首先进行了fork()创建了子子进程,并且父进程直接exit了就好。如果你想知道详细的过程:
https://blog.csdn.net/JMW1407/article/details/108412836
并且从参数也能看出为什么它和终端并不挂钩,是因为它的工作目录以南都配置到了“/”,也就是最基本的根目录中。不随你的终端启动而启动,而是一般跟随内核一起启动。
但是我们手动写的保护进程想要开机启动是需要配置一些文件的:
首先访问对应配置文件 vi /etc/rc.local
然后在最后一行加上一个绝对路径:/home/name/programname
当然,还有一种配置方法是使用脚本,但是我觉得效率还不一定有这个高,而且需要你写一个脚本复制进来,很麻烦就不赘述了。
3.UDEV的规则文件
在流程中的步骤b里能知道,udev主要的操作是依托于规则文件的,而这个机制最重要的地方就是我们灵活的使用规则文件。
首先规则文件都存于/etc/udev/rule.d/中,其次该类型的文件必须已.rule结尾。我们可以通过自己创建一个规则文件,写入相关规则来对于一些未知的设备进行挂载。
比如:
touch /etc/udev/rule.d/myrule.rule
然后在文件里写入:KERNEL=="usb", NAME="usb_devices", MODE="0660" 那么就可以挂在一个未知的设备。
基本的规则为:
ACTION:事件(uevent)的行为,例如:add(添加设备)、remove(删除设备);
KERNEL:内核设备名称,例如:sda,cdrom;
DEVPATH:设备的 devpath 路径;
SUBSYSTEM:设备的子系统名称,例如:sda 的系统为 block;
BUS:设备在 devpath 里的总线名称,例如:usb;
DRIVER:设备在 devpath 的设备驱动名称,例如:ide-cdrom;
ID:设备在 devpath 里的识别号;
SYSFS{filename}:设备的 devpath 路径下,设备的属性文件 "filename" 里的内容;
ENV{key}:环境变量。在一条规则中,可以设定最多五条环境变量的 匹配键;
PROGRAM:调用外部命令;
RESULT:外部命令 PROGRAM 的返回结果
匹配符号:
“==” ,“!=”这种是匹配符,标志“如果匹配” “如果不匹配”。 “=” 这种是赋值符号,为属性赋值