基于wiringPi库写的一些代码(二)
1. linux的热拔插udev机制1.1 热拔插:在开机和运行的状态下可以安全地安装或者转移硬件不需要关闭电源或者重启。1.2 udev•udev是一个设备管理工具udev以守护进程的形式运行通过侦听内核发出来的event(事件)来管理/dev目录下的设备文件。udev在用户空间运行而不在内核空间 运行。它能够根据系统中的硬件设备的状态动态更新设备文件包括设备文件的创建删除等。设备文件通常放在/dev目录下。使用udev后在/dev目录下就只包含系统中真正存在的设备。1.3 例子•例如在上述的实验中:•手机刚刚插进去开发板之后应用程序是不能使用手机的(因为adb(应用层)找不到对应usb设备文件(应用层是没有权限使用这个设备文件))例如执行adb会不成功。•一开始当有usb设备(手机)接入开发板的时候是内核先知道usb设备的(这里把设备接入开发板仅仅只是实现了让内核知道而已可以使用dmesg可以知道设备的信息但是在应用层是不认识这个设备的应用层是没法访问到设备的(没权限)怎样才能认识这个设备并为这个设备创建文件 -- udev机制)。•但是在应用层(应用程序adb)是没法访问到usb设备的虽然此时在dev目录下还有对应的usb设备文件(找不到对应的手机设备文件)但是在应用层就没法访问到usb设备的(没权限)。怎样可以让应用层认识设备并创建设备文件 --使用udev规则。•只有当udev检测到内核中有侦听到有usb设备接入的信息并且添加了对应的udev规则才会在/dev/bus/usb/001那里动态创建设备文件(并且这这个文件的权限是0666)之后adb程序(应用层)能访问到usb设备(手机)。•但是前提必须要有下面对应的规则才能配置对应的设备文件如果没有这条规则就不会为新接入的设备配置对应的设备文件权限(usb设备)。•当在/etc/udev/rules.d这个目录下创建vivo-android.rules(赋予usb设备可读可写权限)这个文件给 udev服务和使用之后应用层可以访问usb设备了(可以使用adb去访问了)。•简单说没有udev规则udev机制就不知道如何管理设备没有udev机制规则就只是一堆文本文件。两者紧密结合共同实现 Linux 的动态设备管理。2. 守护进程2.1 概念:•Linux Daemon守护进程是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行并且能提供某种服务不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的。常见的守护进程包括系统日志进程syslogd、web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等。守护进程的名称通常以d结尾。•例如:udev守护进程它能够根据系统中的硬件设备的状态动态来更新设备文件包括设备文件的创建删除等。2.2 基本特点• 生存周期长[非必须]一般操作系统启动的时候就启动关闭的时候关闭。• 守护进程和终端无关联也就是他们没有控制终端所以当控制终端退出也不会导致守护进程退出。• 守护进程是在后台运行不会占着终端终端可以执行其他命令。• 一个守护进程的父进程是init进程因为它真正的父进程在fork出子进程后就先于子进程exit退出了所以它是一个由init继承的孤儿进程。• 如图:• ppid 0内核进程跟随系统启动而启动生命周期贯穿整个系统。• cmd列名带[]这种叫内核守护进程。• 老祖init也是系统守护进程它负责启动各运行层次特定的系统服务所以很多进程的PPID是init也负责收养孤儿进程。• cmd列中名字不带[]的普通守护进程用户守护进程。2.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, 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/orangepi/daemon.log, 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; } //sudo vi /etc/rc.local 开机自启动绝对路径加程序名字一开机就能启动这个守护进程了。3. 守护进程的应用3.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, 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){ if( judMent() -1){ system(/home/orangepi/hardwareSoft/douyin/douyinUtils /dev/ttyS5 ); } sleep(2); } return 0; } //开机启动 // /home/orangepi/hardwareSoft/douyin/douyinUtils /dev/ttyS5 添加了变成后台程序。 // /home/orangepi/hardwareSoft/douyin/shouhuDouyin3.2守护进程和后台进程的区别• 守护进程和终端不挂钩后台进程能往终端上输出东西(和终端挂钩)。• 守护进程关闭终端时不受影响守护进程不会随着终端的退出而退出。4. 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/设备名字 这个指令可以查设备的所有信息。4.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

相关新闻

一份不可多得的 《 Redis 》教程 | 8K字

一份不可多得的 《 Redis 》教程 | 8K字

Redis 从入门到实战:超详细零基础教程 Redis(Remote Dictionary Server)是一款开源的 高性能的键值对(Key-Value)内存数据库 同时支持持久化、分布式、多种数据结构,被广泛应用于缓存、消息队列、会话存储…

2026/7/4 23:39:05 阅读更多 →
探秘AI教材生成!利用AI工具编写教材,轻松实现低查重率

探秘AI教材生成!利用AI工具编写教材,轻松实现低查重率

刚完成教材初稿的我,深刻体会到修改和优化的过程如同一场“折磨”!通篇阅读查找逻辑错误和知识点不准确,需要耗费不少时间。调整一个章节的结构,可能会影响到后续多个部分,导致修改的工作量以几何级数增长。收到反馈后…

2026/7/3 14:22:34 阅读更多 →
[Linux] vdso 32bit vs 64bit

[Linux] vdso 32bit vs 64bit

不实践还真是不知道,vdso,在32位和64位之间还有差别。 https://github.com/mzhan017/dump-vdso 32bit的vdso提供的接口函数: mzhan017:/mnt/d/dump-vdso$ ./dump-vdso-32 -s Name Address Offset …

2026/7/5 0:40:53 阅读更多 →

最新新闻

iOS27 App Intents 实战

iOS27 App Intents 实战

iOS27 App Intents 实战:新版 Siri 快捷指令接入全流程教程随着WWDC2026的正式落幕,苹果推送的iOS27带来了Siri架构的全面重构,其中最核心的变化就是正式弃用SiriKit,将App Intents确立为第三方应用接入Siri的唯一官方框架。对于开…

2026/7/5 3:29:02 阅读更多 →
Transformer 英中翻译实战:PyTorch 从零实现,BLEU 值提升 15% 的 3 个关键调参技巧

Transformer 英中翻译实战:PyTorch 从零实现,BLEU 值提升 15% 的 3 个关键调参技巧

Transformer 英中翻译实战:PyTorch 从零实现,BLEU 值提升 15% 的 3 个关键调参技巧在机器翻译领域,Transformer 架构已经成为事实上的标准。本文将带你从零开始实现一个完整的英中翻译模型,并分享三个经过实战验证的关键调参技巧&…

2026/7/5 3:27:02 阅读更多 →
利用RAG构建品牌AI知识库:六步SOP提升技术影响力

利用RAG构建品牌AI知识库:六步SOP提升技术影响力

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 你的品牌、产品、技术文档,是否正在被 AI 遗忘?当开发者向 ChatGPT、Claude 或国内大模型提问“如何集成 XX S…

2026/7/5 3:25:01 阅读更多 →
DesignWare® Cores LPDDR5/4/4x PHY for TSMC12FFC18 Databook的中文版

DesignWare® Cores LPDDR5/4/4x PHY for TSMC12FFC18 Databook的中文版

DesignWare Cores LPDDR5/4/4x PHY for TSMC12FFC18 Databook的中文版,dwc_lpddr54_phy_tsmc12ffc18- Product Code: D774-0,PHY Version: 2.40a July 8, 2021,是DW LPDDR5/4 PHY在TSMC12FFC工艺下的技术数据手册,为芯片设计者提供…

2026/7/5 3:25:01 阅读更多 →
曲线曲线2D解析求交方案

曲线曲线2D解析求交方案

曲线曲线2D解析求交方案 文章目录曲线曲线2D解析求交方案一. 2D 点到椭圆的最近点计算1. 推荐主方案:λ 方程 Halley bracket 保护2. bracket 区间3. Halley bracket 保护4. Newton bracket 对比实现5. 轴线和中心特殊情况6. 椭圆弧最近点7. 方向角初值方案的定位…

2026/7/5 3:23:00 阅读更多 →
Entity Framework 4.1 DbContext使用记之三——如何玩转实体的属性值?

Entity Framework 4.1 DbContext使用记之三——如何玩转实体的属性值?

今天为大家带来DbSet.Local属性的使用与实现。和上次介绍的Find函数首先查找context中缓存的实体类似,DbSet的Local属性也是返回context中缓存并且被跟踪的实体。不同点在于,Local属性不会返回状态为EntityState.Deleted的实体,且即使缓存中什…

2026/7/5 3:23:00 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻