Linux下的UDEV机制/守护进程

news/2024/5/7 14:22:08

一. Udev机制概念引入 

   e4de1e6ba3d14e0da7da1aea681a5e5c.jpeg

    ( 需要在  etc/udev/rules.d/  下创建设备的相关规则,不然有可能udev机制生成的设备文件不具备可读可写的权限,adb无法成功通过该设备文件访问设备 )

       a. 创建文件夹         sudo vim Xiaomi-audroid.rules

       b. 添加规则            SUBSYSTEM=="usb",ENV{"usb_device",MODE="0666"}

 

二. 守护进程

1. 概念:

        568d3d2bd7e54fdd9b5b65dc78de3fff.jpeg

2. 基本特点:

        a.  生存周期长,一般操作系统启动的时候就启动,关闭的时候关闭(这是由开发人员自行将守护进程添加到开机启动项的)

        b.  守护进程和终端无关联,也就是他们没有控制终端,所以当控制终端退出,也不会导致守护进程退出。守护进程是在后台运行,不会占着终端,终端可以执行其他命令。

        c.  守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是一个由init继承的孤儿进程。(这里ppid为1可看到其父进程为init进程)

6118639a2bd5455fad3f65be6df68cce.png

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

 

3.  ppid = 0:内核进程,跟随系统启动而启动,生命周期贯穿整个系统。      

     cmd列名带 [] 的,叫做内核守护进程。cmd列名名字不带 [] 的,并且以d结尾的一般是普通守护进程。

 

4. 守护进程开发

     功能:创建一个守护进程,该守护进程会周期性地向指定的日志文件中写入当前时间

/**
* 功能:创建一个守护进程,该守护进程会周期性地向指定的日志文件中写入当前时间
*/
#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\nI'm quitting.\n", sig);flag = false;
}int main()
{time_t t;int fd;// 创建守护进程daemon(0, 0);// 设置信号处理函数,接收到SIGQUIT信号时退出守护进程struct sigaction act;act.sa_handler = handler;//用于将信号集 act.sa_mask 初始化为空集sigemptyset(&act.sa_mask);act.sa_flags = 0;sigaction(SIGQUIT, &act, NULL);// 进程工作内容,不断向日志中写入当前时间,间隔10swhile (flag){fd = open("/home/orangepi/daemon.log", O_WRONLY | O_CREAT | O_APPEND, 0644);if (fd == -1){printf("open error\n");continue;}t = time(0);/** * 1. 函数 struct tm *localtime(const time_t *timer) 使用timer的值来填充tm结构。*    timer的值被分解为tm结构。* 2. char *asctime(const struct tm *timeptr)返回一个指向字符串的指针,*    它代表了结构 struct timeptr 的日期和时间。* 3. struct tm {int tm_sec;   // 秒,范围从 0 到 59int tm_min;   // 分,范围从 0 到 59int tm_hour;  // 时,范围从 0 到 23int tm_mday;  // 一个月中的日,范围从 1 到 31int tm_mon;   // 月份,范围从 0 到 11int tm_year;  // 年份,从 1900 开始int tm_wday;  // 一周中的日,范围从 0 (周日) 到 6 (周六)int tm_yday;  // 一年中的日,范围从 0 到 365int tm_isdst; // 夏令时标识};*/char *buf = asctime(localtime(&t));write(fd, buf, strlen(buf));close(fd);sleep(10);}return 0;
}

        运行后,输入 ps -ef|grep a.out|grep -v grep 可看到该守护进程。

        输入 sudo kill -3 进程pid ,即可杀死该守护进程。

 

5. 语言刷抖音——守护进程版

#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdbool.h>static bool flag = true;void handler(int sig){//收到退出信号,退出守护进程,打印退出语句printf("I got a signal %d\n", sig);printf("I'm quitting\n");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);pclose(file);if (strstr(buffer, "douyinUtils") != NULL){return 0;} else {return 1;}
}int main()
{time_t t;int fd;// 创建守护进程if (daemon(0, 0) == -1) {printf("daemon error\n");exit(1);}// 设置信号处理函数,接收到SIGQUIT信号时退出守护进程struct sigaction act;act.sa_handler = handler;//用于将信号集 act.sa_mask 初始化为空集sigemptyset(&act.sa_mask);act.sa_flags = 0;sigaction(SIGQUIT, &act, NULL);// 进程工作内容while (flag){if (judMent() == -1){system("/home/orangepi/Desktop/douyin/douyinUtils /dev/ttyS5 &");            }sleep(2);}return 0;
}

        开机启动

        sudo vi /etc/rc.local

        /home/orangepi/Desktop/douyin/douyinUtils /dev/ttyS5 &

        /home/orangepi/Desktop/douyin/shouhuDouyin

6. 自动挂载U盘

        6.1 手动挂载U盘

                首先,插入U盘后,输入 demsg 查看内核信息,查看U盘分区(例如 sda1)。

                然后,手动将 U 盘挂载到 /mnt/ 目录,使用命令:sudo mount /dev/sda1 /mnt/

                切换到 /mnt/ 目录,输入 ls 命令,即可查看 U 盘中的文件和文件夹列表。

 

       6.2 修改手机的Udev规则

插入手机后,输入ls  /dev/bus/usb/001  可以看到多出了类似于005。再次输入 udevadm  info --attribute -walk --name==/dev/bus/usb/001/005可以查看到更多有关于手机的详细信息。

sudo vim Xiaomi-audroid.rules

  修改下面的规则                SUBSYSTEM=="usb",ENV{DEVTYPE}="usb_device",MODE="0666"

   变为

SUBSYSTEM=="usb", ATTRS{idvendor}=="2a70",ATTRS{idproduct}=="4ee7",MODE="0666"

         6.2 利用Udev机制自动挂载U盘

添加下面规则到 cd /etc/udev/rules.d/ 中,sudo vi 。

 ACTION=="add",SUBSYSTEMS=="usb",SUBSYSTEM=="block",RUN{program}+="/bin       /mkdir/media/%k",RUN{program}+="/usr/bin/systemd-mount--no-block--   collect$devnode/media/%k"

 

该规则将在设备被添加时触发(条件:必须是usb子系统,必须是块设备)。通过RUN指令执行俩个步骤,第一步: 是在/media/目录下创建一个以设备名命名的子目录。

第二步: 将设备自动挂载到该目录中。

 

 


http://www.mrgr.cn/p/15034312

相关文章

【汇编语言】流程转移和子程序

【汇编语言】流程转移和子程序 文章目录 【汇编语言】流程转移和子程序前言一、“转移”综述二、操作符offset三、jmp指令jmp指令——无条件转移jmp指令&#xff1a;依据位移进行转移两种段内转移远转移&#xff1a;jmp far ptr 标号转移地址在寄存器中的jmp指令转移地址在内存…

球体与棱柱的切接问题

球体与棱柱的切接问题前言 球体与正三棱柱正三棱柱不一定有内切球和棱切球,但一定有外接球。正三棱柱的外接球的球心是上下底面中心连线的中点,关键关系:正三棱柱的高为 \(h\),正三棱柱的底面外接圆的半径 \(r\) 与球的半径 \(R\) 之间的关系为 \((\cfrac{h}{2})^2+r^2=R^2…

帆软笔记

一:表格值自定义显示 1、日期型格式化:=FORMAT($$$,"MM月dd日"),或者 2、普通值自定义显示:if($$$=SW_1,丝网一号机,if($$$=SW_2,丝网二号机,丝网三号机)),或者 二:从数据集中再次筛选,如Sum运算SUM(表格.select(QTY_SW, SHIFT_CODE_NAME = B3 && WO…

户外旅行摄影手册,旅游摄影完全攻略

一、资料前言 本套旅游摄影资料&#xff0c;大小295.47M&#xff0c;共有9个文件。 二、资料目录 《川藏线旅游摄影》杨桦.彩印版.pdf 《户外摄影指南》(Essential.Guide.to.Outdoor.photography.amateur)影印版.pdf 《旅行摄影大师班》(英)科尼什.扫描版.PDF 《旅行摄影…

linu管理文本文件

vi\vim编辑器的三种工作模式 命令模式(Command mode):按键编辑器都理解为命令,以命令驱动执行不同的功能。此模型下,不能自由进行文本编辑。 输入模式(Insert mode):也就是所谓的编辑模式、插入模式。此模式下,可以对文件内容进行自由编辑。 底线命令模式(Last line …

第十五届蓝桥杯省赛第二场C/C++B组F题【狡兔k窟】题解(AC)

题意分析 有一个 n n n 个点&#xff0c; n − 1 n-1 n−1 条边的无向图&#xff0c;边权均为 1 1 1。 每个点隶属于一个集合&#xff0c;同一个集合的点可以互相传送。 给定 m m m 个询问&#xff0c;求 x , y x, y x,y 的最短距离。 最短路解法 步骤&#xff1a; 建…

【PyTorch】torch.gather() 用法

gather常被用于image做mask的操作中&#xff0c;对哪些地方进行赋值0/1 API&#xff1a; torch.gather — PyTorch 2.2 documentation torch.gather(input, dim, index, outNone) → Tensor gather()的意义&#xff1a; 顾名思义&#xff0c;聚集、集合&#xff1a;gather…

1500PLC通过Modbus转Profinet网关与流量计Modbus通讯

Modbus转Profinet网关(XD-MDPN100)是一种能够实现Modbus协议和Profinet协议之间转换的设备。通过使用Modbus转Profinet网关,可以实现流量计与1500PLC之间的高效通讯,使得设备之间的数据交换更加便捷和高效。1500PLC作为控制器,与Modbus转Profinet网关的结合,为工业控制系…

实验三

TASK 1点击查看代码 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <windows.h> #define N 80void print_text(int line, int col, char text[]); // 函数声明 void print_spaces(int n); // 函数声明 void print_blank_lin…

Https协议原理剖析【计算机网络】【三种加密方法 | CA证书 】

目录 一&#xff0c;fidler工具 前提知识 二&#xff0c;Https原理解析 1. 中间人攻击 2. 常见的加密方式 1&#xff09;. 对称加密 2&#xff09;. 非对称加密 对称加密 4&#xff09;. CA证书 1. 数据摘要 3. 数字签名 CA证书 理解数据签名 存在的安全疑问&am…

JUC工具(Exchange)

Exchanger(交换器),顾名思义,用于两个线程之间进行数据交换Exchanger(交换器),顾名思义,用于两个线程之间进行数据交换 两个线程通过 exchange() 方法交换数据,如果第一个线程先执行 exchange()方法,它会一直等待第二个线程也执行 exchange 方法,当两个线程都到达同…

面试算法题之暴力求解

这里写目录标题 1 回溯1.1 思路及模板1.1 plus 排列组合子集问题1.2 例题1.2.1 全排列1.2.2 N 皇后1.2.3 N皇后问题 II1.2.4 子集 &#xff08;子集/排列问题&#xff09;1.2.4 组合(组合/子集问题)1.2.5 全排列 &#xff08;排列问题&#xff09;1.2.1做过1.2.6 子集II &#…

【机器学习】集成学习---投票法(Voting)

一、引言 集成学习&#xff08;Ensemble Learning&#xff09;是机器学习领域中的一种重要策略&#xff0c;它通过结合多个模型的预测结果来提高整体性能。在单个模型容易过拟合或欠拟合的情况下&#xff0c;集成学习能够通过综合多个模型的优点来减少这种风险&#xff0c;从而…

记内网http洪水攻击,导致网页无法访问一事

事由 最近两日&#xff0c;部分同事在访问税纪云平台时&#xff0c;登录跳转页面频繁转圈、要么就是出现无法连接的错误提示。 无法访问此页面 已重置连接。 请尝试: 检查连接检查代理和防火墙运行 Windows 网络诊断经过以下几方面的排查&#xff0c;无果。 后续通过检查…

[题解]CF61E Enemy is weak

CF61E Enemy is weak 如下图,第\(i\)行\(j\)列表示第\(j\)个数结尾,向前长度为\(i\)的逆序子序列个数。递推方式见下图。第一行全为\(1\)。 要填第\(2\)行的值,就往前找所有\(>\)当前元素的位置,把它们第\(1\)行的值加起来。 要填第\(3\)行的值,就往前找所有\(>\)当…

SSTV音频转图片

SSTV工具有很多&#xff0c;这里使用RX-SSTV慢扫描工具 下载安装 RX-SSTV解码软件 下载地址&#xff1a;https://www.qsl.net/on6mu/rxsstv.htm 一直点下一步&#xff0c;安装成功如下图: 虚拟声卡e2eSoft 由于SSTV工具是根据音频传递图片信息&#xff0c;正常解法需要一…

Visual Studio 项目发布时将资源目录文件夹所有文件拷贝到发布路径

1.背景 在 .NET 项目开发过程中,时常需要将资源文件夹复制到生成目录,以确保这些资源随项目输出。 2.方法找到当前项目例如:xxxxx.Api 双击 进入,对 .csproj文件内容 ,加入如下信息:<Target Name="CopyResourcesPublish" AfterTargets="Publish"…

04、数据保护技术

数据保护技术 1.磁盘镜像制作 1.1.Windows 磁盘镜像制作及恢复 GetData Forenisc Imager 该工具安装后,可将安装后的文件复制出来(类似绿色运行) 使用(需要管理员运行):https://getdataforensics.com/product/fex-imager/DataNumen Disk Image 1.2.Linux 磁盘镜像制作(命…

虚拟机VMware安装与Ubuntu

1.虚拟机安装 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;2fr6 CG54H-D8D0H-H8DHY-C6X7X-N2KG6 2.Ubuntu下载 Download Ubuntu Desktop | Ubuntu 3.设置 如后续要下一些软件越大越好

ctfshow web29-web40

命令执行 看清都过滤了些什么&#xff01;&#xff01; 知识点&#xff1a; web34&#xff1a;当;和()被过滤了就用语言结构&#xff0c;一般有echo print isset unset include require web37&#xff1a;data协议是将后面的字符串当成php代码执行&#xff0c;例如 /?cdat…