linux的热拔插UDEV机制

目录

一 守护进程

1.1 守护基本特点

1.2 如何分辨守护进程,内核进程

二 守护进程开发方式(daemon)

2.1 daemon函数原型:

2.2 守护进程——每过10秒获取一次系统时间,并写入文件 

三 守护进程和后台进程的区别

四 UDEV的配置文件


简介:

udev是一个设备管理工具,udev以守护进程的形式运行,通过侦听内核发出来的uevent来管 理/dev目录下的设备文件。udev在用户空间运行,而不在内核空间 运行。它能够根据系统中的硬 件设备的状态动态更新设备文件,包括设备文件的创建,删除等。设备文件通常放在/dev目录 下。使用udev后,在/dev目录下就只包含系统中真正存在的设备。

                                           图1:应用空间想要操作硬件经过

一 守护进程

Linux Daemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个 系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的。常见的 守护进程包括系统日志进程syslogdweb服务器httpd邮件服务器sendmail数据库服务器mysqld等。

守护进程的名称通常以d结尾

UDEV守护进程,它能够根据系统中的硬件设备的状态动态更新设备文件,包括设备文件的创建,删除等。

1.1 守护基本特点

  1. 生存周期长[非必须],一般操作系统启动的时候就启动,关闭的时候关闭。
  2. 守护进程和终端无关联,也就是他们没有控制终端,所以当控制终端退出,也不会导致守护进程退 出 
  3. 守护进程是在后台运行,不会占着终端,终端可以执行其他命令
  4. 一个守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出 了,所以它是一个由init继承的孤儿进程

linux操作系统本身是有很多的守护进程在默默执行,维持着系统的日常活动。大概30-50个

1.2 如何分辨守护进程,内核进程

用ps -axj命令查看系统中的进程。参数a表示不仅列当前用户的进程,也列出所有其他用户的进程;参数x表示不仅列出有控制终端的进程,也列出所有无控制终端的进程;参数j表示列出与作业控制相关的进程。

  

  1. ppid = 0:内核进程,跟随系统启动而启动,生命周期贯穿整个系统。
  2. cmd列名带[]这种,叫内核守护进程
  3. 老祖init:也是系统守护进程,它负责启动各运行层次特定的系统服务;所以很多进程的PPID是init,也 负责收养孤儿进程。
  4. cmd列中名字不带[]的普通守护进程(用户集守护进程)
  5. TPGID一栏写着-1的都是没有控制终端的进程,也就是守护进程。
  6. 在COMMAND一列用[]括起来的名字表示内核线程,这些线程在内核里创建,没有用户控件代码,因此没有程序文件名和命令行,通常采用以k开头的名字,表示Kernel。

二 守护进程开发方式(daemon)

2.1 daemon函数原型:

#include <unistd.h>
int daemon(int nochdir, int noclose);
  1.    nochdir:为0时表示将当前目录更改至“/”
  2.    noclose:为0时表示将标准输入、标准输出、标准错误重定向至“/dev/null”
  3.    返回值:成功则返回0,失败返回-1

2.2 守护进程——每过10秒获取一次系统时间,并写入文件 

  • 1.创建一个守护进程(daemon函数)
  • 2.设置信号处理函数(但进程收到SIGQUIT信号,进程退出)
  • 3.获取当前系统时间,利用asctime和locatime转化为人能看的懂的字符串,最后写入目标文件
  • 4.参数flag,当收到SIGQUIT信号时,flag从true变为flase,进程工作部分不执行 
de <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <time.h>
#include <stdio.h>
#include <stdbool.h>
int daemon(int nochdir, int noclose);


//C 库函数 char *asctime(const struct tm *timeptr) 返回一个指向字符串的指针,它代表了结构 struct timeptr 的日期和时间。
//C 库函数 struct tm *localtime(const time_t *timer) 使用 timer 的值来填充 tm 结构。
//timer 的值被分解为 tm 结构,并用本地时区表示。

/*
struct tm {
  int tm_sec;       秒,范围从 0 到 59                
  int tm_min;       分,范围从 0 到 59                
  int tm_hour;       小时,范围从 0 到 23              
  int tm_mday;       一月中的第几天,范围从 1 到 31                  
  int tm_mon;       月份,范围从 0 到 11              
  int tm_year;       自 1900 起的年数              
  int tm_wday;       一周中的第几天,范围从 0 到 6               
  int tm_yday;       一年中的第几天,范围从 0 到 365                   
  int tm_isdst;     夏令时                       
};
*/
static bool flag = true;


void handler(int sig)
{
	printf("I got a signal %d\nI'm quitting.\n", sig);
	flag = false;
}

int main()
{
	time_t t;
	int fd;
	//创建守护进程

	if(-1 == daemon(0, 0))
	{
		printf("daemon error\n");
		exit(1);
	}
	//设置信号处理函数
	struct sigaction act;
	act.sa_handler = handler;
	sigemptyset(&act.sa_mask);
	act.sa_flags = 0;
	if(sigaction(SIGQUIT, &act, NULL))
	{
		printf("sigaction error.\n");
		exit(0);
	}
	//进程工作内容

	while(flag)
	{
		fd = open("/home/chen/linux/linux_basics/udev/demo.c", O_WRONLY | O_CREAT | O_APPEND, 0644);
		if(fd == -1)
		{
			printf("open error\n");
		}
		t = time(0);
		char *buf = asctime(localtime(&t));
		write(fd, buf, strlen(buf));
		close(fd);
		sleep(10);
	}
	return 0;
}

三 守护进程和后台进程的区别

1. 守护进程和终端不挂钩;后台进程能往终端上输出东西(和终端挂钩);

2. 守护进程关闭终端时不受影响,守护进程不会随着终端的退出而退出;

四 UDEV的配置文件

规则文件是 udev 里最重要的部分,默认是存放在 /etc/udev/rule.d/ 下。所有的规则文件必须以 ".rules" 为后缀名。 下面是一个简单的规则:

KERNEL=="sda", NAME="my_root_disk", MODE="0660"

KERNEL 是匹配键,NAME 和 MODE 是赋值键。这条规则的意思是:如果有一个设备的内核名称为 sda,则该条件生效,执行后面的赋值:在 /dev 下产生一个名为my_root_disk 的设备文件,并把设备 文件的权限设为 0660。

udevadm info --attribute-walk --name=/dev/设备名字

SUBSYSTEM=="usb", ATTRS{idVendor}=="2a70", ATTRS{idProduct}=="4ee7", MODE="0666"

udev 规则的匹配键

  1. ACTION:事件(uevent)的行为,例如:add(添加设备)、remove(删除设备);
  2. KERNEL:内核设备名称,例如:sda,cdrom;
  3. DEVPATH:设备的 devpath 路径;
  4. SUBSYSTEM:设备的子系统名称,例如:sda 的系统为 block;
  5. BUS:设备在 devpath 里的总线名称,例如:usb;
  6. DRIVER:设备在 devpath 的设备驱动名称,例如:ide-cdrom;
  7. ID:设备在 devpath 里的识别号;
  8. SYSFS{filename}:设备的 devpath 路径下,设备的属性文件 "filename" 里的内容;
  9. ENV{key}:环境变量。在一条规则中,可以设定最多五条环境变量的 匹配键;
  10. PROGRAM:调用外部命令;
  11. RESULT:外部命令 PROGRAM 的返回结果。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@ChenPi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值