中文字幕99:穿越次元壁垒,点亮全球视界

核心内容摘要

张家界小白龙16分钟震撼演出:一次涤荡心灵的奇幻之旅
开启奇幻新纪元:免费畅读《斗罗玉传3D》与《武炼巅峰》,下拉式漫画带你飞!

8图说明!掇BBBB掇BBBB掇是啥意思?网友停不下来,全网沉迷的“洗脑…”现象

linux的热拔插udev机制

1 热拔插:在开机和运行的状态下可以安全地安装或者转移硬件不需要关闭电源或者重启。

2 udev•udev是一个设备管理工具udev以守护进程的形式运行通过侦听内核发出来的event(事件)来管理/dev目录下的设备文件。

udev在用户空间运行而不在内核空间 运行。

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

设备文件通常放在/dev目录下。

使用udev后在/dev目录下就只包含系统中真正存在的设备。

3 例子•例如在上述的实验中:•手机刚刚插进去开发板之后应用程序是不能使用手机的(因为adb(应用层)找不到对应usb设备文件(应用层是没有权限使用这个设备文件))例如执行adb会不成功。

•一开始当有usb设备(手机)接入开发板的时候是内核先知道usb设备的(这里把设备接入开发板仅仅只是实现了让内核知道而已可以使用dmesg可以知道设备的信息但是在应用层是不认识这个设备的应用层是没法访问到设备的(没权限)怎样才能认识这个设备并为这个设备创建文件 -- udev机制)。

•但是在应用层(应用程序adb)是没法访问到usb设备的虽然此时在dev目录下还有对应的usb设备文件(找不到对应的手机设备文件)但是在应用层就没法访问到usb设备的(没权限)。

怎样可以让应用层认识设备并创建设备文件 --使用udev规则。

•只有当udev检测到内核中有侦听到有usb设备接入的信息并且添加了对应的udev规则才会在/dev/bus/usb/001那里动态创建设备文件(并且这这个文件的权限是

之后adb程序(应用层)能访问到usb设备(手机)。

•但是前提必须要有下面对应的规则才能配置对应的设备文件如果没有这条规则就不会为新接入的设备配置对应的设备文件权限(usb设备)。

•当在/etc/udev/rules.d这个目录下创建vivo-android.rules(赋予usb设备可读可写权限)这个文件给 udev服务和使用之后应用层可以访问usb设备了(可以使用adb去访问了)。

•简单说没有udev规则udev机制就不知道如何管理设备没有udev机制规则就只是一堆文本文件。

两者紧密结合共同实现 Linux 的动态设备管理。

守护进程

1 概念:•Linux Daemon守护进程是运行在后台的一种特殊进程。

它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。

它不需要用户输入就能运行并且能提供某种服务不是对整个系统就是对某个用户程序提供服务。

Linux系统的大多数服务器就是通过守护进程实现的。

常见的守护进程包括系统日志进程syslogd、web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等。

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

•例如:udev守护进程它能够根据系统中的硬件设备的状态动态来更新设备文件包括设备文件的创建删除等。

2 基本特点• 生存周期长[非必须]一般操作系统启动的时候就启动关闭的时候关闭。

• 守护进程和终端无关联也就是他们没有控制终端所以当控制终端退出也不会导致守护进程退出。

• 守护进程是在后台运行不会占着终端终端可以执行其他命令。

• 一个守护进程的父进程是init进程因为它真正的父进程在fork出子进程后就先于子进程exit退出了所以它是一个由init继承的孤儿进程。

• 如图:• ppid 0内核进程跟随系统启动而启动生命周期贯穿整个系统。

• cmd列名带[]这种叫内核守护进程。

• 老祖init也是系统守护进程它负责启动各运行层次特定的系统服务所以很多进程的PPID是init也负责收养孤儿进程。

• cmd列中名字不带[]的普通守护进程用户守护进程。

3守护进程开发方式• 直接借助damon()函数完成。

#include unistd.h /* int daemon(int nochdir, int noclose); 函数参数 nochdir为0时表示将当前目录更改至“/”转换工作目录和脱离终端 noclose为0时表示将标准输入、标准输出、标准错误重定向至“/dev/null” 返回值成功则返回0失败返回-1 */ #include unistd.h #include signal.h #include stdlib.h #include string.h #include fcntl.h #include sys/stat.h #include time.h #include stdio.h //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\nIm quitting.\n, sig); flag false; } int main() { time_t t; int fd; //创建守护进程 if(-1 daemon(0,

){ printf(daemon error\n); exit(

; } //设置信号处理函数 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(

; } //进程工作内容 while(flag){ fd open(/home/orangepi/daemon.log, O_WRONLY | O_CREAT | O_APPEND,

; if(fd -

{ printf(open error\n); } t time(

;//获取当前时间戳 char *buf asctime(localtime(t)); write(fd, buf, strlen(buf)); close(fd); sleep(

; } return 0; } //sudo vi /etc/rc.local 开机自启动绝对路径加程序名字一开机就能启动这个守护进程了。

守护进程的应用

1守护进程不让控制程序退出#include 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 static bool flag true; void handler(int sig){ printf(I got a signal %d\nIm quitting.\n, sig); flag false; } int judMent(){ FILE *file; char buffer[128] {\0}; char *cmd ps -elf |grep douyinUtils|grep -v grep; file popen(cmd, r); fgets(buffer, 128, file); if(strstr(buffer, douyinUtils) ! NULL){ return 0; }else{ return -1; } printf(BUFFER:%s\n,buffer); } int main(){ time_t t; int fd; //创建守护进程 if(-1 daemon(0,

){ printf(daemon error\n); exit(

; } //设置信号处理函数 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(

; } //进程工作内容 while(flag){ if( judMent() -

{ system(/home/orangepi/hardwareSoft/douyin/douyinUtils /dev/ttyS5 ); } sleep(

; } return 0; } //开机启动 // /home/orangepi/hardwareSoft/douyin/douyinUtils /dev/ttyS5 添加了变成后台程序。

// /home/orangepi/hardwareSoft/douyin/shouhuDouyin

2守护进程和后台进程的区别• 守护进程和终端不挂钩后台进程能往终端上输出东西(和终端挂钩)。

• 守护进程关闭终端时不受影响守护进程不会随着终端的退出而退出。

udev规则的补充• 规则文件是 udev里最重要的部分默认是存放在/etc/udev/rule.d/ 下。

所有的规则文件必须以 .rules 为后缀名。

这是一个简单的规则KERNELsda, NAMEmy_root_disk, MODE0660• KERNEL 是匹配键NAME和MODE是赋值键。

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

• udevadm info --attribute-walk --name/dev/设备名字 这个指令可以查设备的所有信息。

1 udev匹配键ACTION事件uevent的行为例如add添加设备、remove删除设备 KERNEL内核设备名称例如sdacdrom DEVPATH设备的 devpath 路径 SUBSYSTEM设备的子系统名称例如sda 的系统为 block BUS设备在 devpath 里的总线名称例如usb DRIVER设备在 devpath 的设备驱动名称例如ide-cdrom ID设备在 devpath 里的识别号 SYSFS{filename}设备的 devpath 路径下设备的属性文件 filename 里的内容 ENV{key}环境变量。

在一条规则中可以设定最多五条环境变量的 匹配键 PROGRAM调用外部命令 RESULT外部命令 PROGRAM 的返回结果。

• 例如自动挂载U盘的规则:ACTIONadd, SUBSYSTEMSusb, SUBSYSTEMblock, RUN{program}/bin/mkdir/media/%k ,RUN{program}/usr/bin/systemd-mount --no-block --collect $devnode/media/%k

榴莲视频色版-榴莲视频色版应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123