Linux下的UDEV机制/守护进程

news2025/1/16 13:54:51

一. Udev机制

e4de1e6ba3d14e0da7da1aea681a5e5c.jpeg

二. 守护进程

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);

    // 进程工作内容,不断向日志中写入当前时间,间隔10s
    while (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 到 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; // 夏令时标识
                };
        */
        char *buf = asctime(localtime(&t));
        write(fd, buf, strlen(buf));
        close(fd);
        sleep(10);
    }
    
    return 0;
}


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

        输入 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盘

        a.  dmesg   查看内核信息,查看U盘分区(我的显示的是 sda1 )。

        b.  sudo mount /dev/sda1 /mnt/   手动将 U 盘挂载到 /mnt/ 目录。

        c.  cd /mnt/   切换到mnt目录

        d.  ls   即可查看 U 盘中的内容

7. 利用Udev机制自动挂载U盘

        a.  cd /etc/udev/rules.d/ 

        b.  sudo vi USB.rules

            添加下面规则即可

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/目录下创建一个以设备名命名的子目录,第二步: 将设备自动挂载到media目录中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1628468.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云备份项目->配置环境

升级gcc到7.3版本 sudo yum install centos-release-scl-rh centos-release-scl sudo yum install devtoolset-7-gcc devtoolset-7-gcc-c source /opt/rh/devtoolset-7/enable echo "source /opt/rh/devtoolset-7/enable" >> ~/.bashrc 安装Jsoncpp库 sud…

知识分享之cookie

http协议中的cookie&#xff0c;什么是cookie如何获取cookie 一、什么是Cookie Cookie&#xff08;曲奇&#xff0c;小甜饼的译名&#xff09;在互联网技术领域中&#xff0c;是指一种小型文本文件&#xff0c;它由网站服务器发送给用户的浏览器&#xff0c;并被浏览器存储在用…

【春 联---turtle海龟画图】

春联 又称"春贴"、"门对"、"对联"&#xff0c;是过年时所贴的红色喜庆元素"年红"中一个种类。它以对仗工整、简洁箱巧的文字描绘美好形象&#xff0c;抒发美好愿 望&#xff0c;是中国特有的文学形式&#xff0c;是华人们过年 的重要习…

windows/linux 安装php的 sql server 扩展

Windowsphpstudyphp7.1 下载&#xff1a;ODBC、下载php 的sql server 扩展 路径&#xff1a;下载地址 版本&#xff1a;我的是7.1 对应的ODBC 是13&#xff0c;php 的sql server 扩展为4.3 安装&#xff1a;msodbcsql 直接安装、sqlsrv43 安装完把 扩展复制到php71 的扩展文…

c#学习入门2

十、运算符 1&#xff09;算术运算符是用于数值类型变量计算的运算符&#xff0c;它返回的结果是数值 1.赋值符号 2.算数运算符 加 减- 乘* 除/ 取余% 3.算数运算符的优先级 4.算术运算符的复合运算 5.算术运算符的自增减 2&#xff09;字符串拼接 1.字符串拼接方式1 注意&…

antd 日期控件RangePicker如何增加快捷键(日/周/月/年)

注意&#xff1a;快捷键是从当前日期往前推算的 效果 代码 <script><RangePickerranges{{日: [moment(new Date().setDate(new Date().getDate() - 1)), moment(new Date())],周: [moment(new Date().setDate(new Date().getDate() - 7)), moment(new Date())],月: […

淘宝API接口教程:淘宝商品详情API接口(标题|主图|SKU|价格|商品销量..)

淘宝商品详情数据接口是用于获取商品详细信息的API&#xff0c;它允许开发者检索商品的各类数据。 要使用淘宝商品详情数据接口&#xff0c;你需要遵循以下步骤&#xff1a; 注册账号和权限申请&#xff1a;在淘宝开放平台注册开发者账号&#xff0c;并申请所需API的权限。完…

【总结】CycleGAN+YOLOv8+DeepSORT

本文章仅对本人前期工作进行总结&#xff0c;文章内容供读者参考&#xff0c;代码不对外公开 文章目录 1、CycleGAN1.1 数据集配置1.2 环境配置1.3 参数配置1.4 可视化训练过程1.5 训练结果1.5 结果测试 2、YOLOv82.1 数据集配置2.2 网络结构配置2.3 训练细节2.4 测试 3、Deep…

IDEA生成JavaDoc注释

1、新建java文件时默认在主类头上生成描述、作者、时间 /*** 总体描述** author CountryStrong* date ${DATE} ${TIME}</p>*/2、对java方法进行doc注释&#xff0c;并动态生成作用描述、请求参数、返回类型、抛出异常 直接去插件商店下载JavaDoc即可&#xff0c;有时间…

Python 中方法调用的求值顺序

问题背景 在 Python 中&#xff0c;方法调用的求值顺序可能会令人困惑&#xff0c;尤其是当涉及到嵌套方法调用时。例如&#xff0c;在下面的代码中&#xff0c;我们有一个 Card 类&#xff0c;它表示一张扑克牌&#xff0c;一个 Hand 类&#xff0c;它表示一组扑克牌&#xff…

【科学研究】读博:一场精神赌博❓

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

Java | Leetcode Java题解之第52题N皇后II

题目&#xff1a; 题解&#xff1a; class Solution {public int totalNQueens(int n) {Set<Integer> columns new HashSet<Integer>();Set<Integer> diagonals1 new HashSet<Integer>();Set<Integer> diagonals2 new HashSet<Integer>…

炒股自动化:券商官方,散户可用,查询订单状态API如何用?

券商官方的接口&#xff0c;个人账户可申请&#xff0c;入金门槛低&#xff0c;接入文档完善&#xff0c;技术支持好的&#xff0c;经过我们筛选后&#xff0c;只有一家符合 会编程&#xff0c;有基础&#xff0c;只是需要API接口的朋友不用看这些&#xff0c;不会写程序的朋友…

数据结构五:线性表之带头结点的双向链表的设计

我们在单链表中&#xff0c;有了next指针,这就使得我们要查找下一结点的时间复杂度为O(1)。可是如果我们要查找的是上一结点的话&#xff0c;那最坏的时间复杂度就是0[n)了&#xff0c;因为我们每次都要从头开始遍历查找。为了克服单向性这一缺点&#xff0c; 我们的老科学家们…

springcloud按版本发布微服务达到不停机更新的效果

本文基于以下环境完成 spring-boot 2.3.2.RELEASEspring-cloud Hoxton.SR9spring-cloud-alibaba 2.2.6.RELEASEspring-cloud-starter-gateway 2.2.6.RELEASEspring-cloud-starter-loadbalancer 2.2.6.RELEASEnacos 2.0.3 一、思路 实现思路&#xff1a; 前端项目在请求后端接…

【优质书籍推荐】AIGC时代的PyTorch 深度学习与企业级项目实战

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二名&#xff0c;科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

Facebook的未知力量:数字世界的新引擎

在数字化的时代&#xff0c;社交媒体已经成为了我们日常生活中不可或缺的一部分&#xff0c;而Facebook作为其中的巨头&#xff0c;其影响力远远超出了我们的想象。但是&#xff0c;Facebook背后隐藏的力量和影响远不止于此&#xff0c;它正逐渐成为数字世界的新引擎&#xff0…

设计模式:单例、原型和生成器

在这篇文章中&#xff0c;我们将重点介绍其余的创建模式&#xff1a;Singleton&#xff0c;Builder和Prototype。 在我看来&#xff0c;这些模式不如工厂重要。然而&#xff0c;了解它们仍然很有用。我将提供UML描述&#xff0c;简单的java示例&#xff08;这样即使你不了解jav…

stm32 hid自定义接收发送程序开发过程记录

cubleMX配置如下 修改端点描述符一次传输的数据大小 根据cubelMX标准在这里修改 编译错误 直接修改&#xff08;因为没有使用nodef &#xff09;编译通过 修改报告描述符&#xff08;默认的描述符无法传输数据&#xff09; 参考&#xff1a;USB协议详解第10讲&#xff08;USB描…

基于SpringBoot的“在线BLOG网”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“在线BLOG网”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 在线BLOG网结构功能图 管理员登录功能界面 用户信息…