Linux的热拔插UDEV机制

news/2024/11/23 4:20:08/

文章目录

  • UDEV简介
  • 守护进程
    • 基本特点
  • 守护进程和后台进程的区别
  • 开发守护进程
  • 结束

UDEV简介

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

udev在用户空间运行,而不在内核空间 运行。它能够根据系统中的硬件设备的状态动态更新设备文件,包括设备文件的创建,删除等。

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

在这里插入图片描述

守护进程

Linux Daemon(守护进程)是运行在后台的一种特殊进程。

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

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

Linux系统的大多数服务器就是通过守护进程实现的。常见的守护进程包括系统日志进程syslogd、 web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等。守护进程的名称通常以d结尾

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

基本特点

生存周期长[非必须],一般操作系统启动的时候就启动,关闭的时候关闭。

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

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

在这里插入图片描述
ppid = 0:内核进程,跟随系统启动而启动,生命周期贯穿整个系统。

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

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

cmd列中名字不带[]的普通守护进程(用户集守护进程)

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

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

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

开发守护进程

直接借助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 到 59int tm_min; 分,范围从 0 到 59int tm_hour; 小时,范围从 0 到 23int tm_mday; 一月中的第几天,范围从 1 到 31int tm_mon; 月份,范围从 0 到 11int tm_year; 自 1900 起的年数int tm_wday; 一周中的第几天,范围从 0 到 6int tm_yday; 一年中的第几天,范围从 0 到 365int 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/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 //开机自启动,绝对路径加程序名字

结束

如有问题,欢迎提出,共同进步。


http://www.ppmy.cn/news/1049397.html

相关文章

bindtap和catchtap的区别?

在微信小程序中&#xff0c;bindtap 和 catchtap 都是用于绑定点击事件的属性&#xff0c;但它们在事件冒泡和事件捕获方面有所不同。下面是它们的区别&#xff1a; bindtap&#xff1a; bindtap 用于绑定点击事件&#xff0c;当元素被点击时&#xff0c;该事件会被触发。事件…

搭建开发环境-操作系统篇(一键搭建开发环境)

概述 所谓工欲善其事必先利其器&#xff0c;搭环境往往是开发过程中卡出很多初学者的拦路虎。 对于很多老鸟来说&#xff0c;很多东西都已经习惯成自然&#xff0c;也就没有刻意和初学者说。但对于很多初学者&#xff0c;却是受益良多。 这个系列&#xff0c;先从操作系统开始…

排序(七种排序)

1.插入排序 2.希尔排序 3.选择排序 4.堆排序 5.冒泡排序 6.快速排序 7.归并排序 1.插入排序 1.1思路 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为 止&#xff0c;得到一个新的有序序列 1.2实现 //插入排…

部署问题集合(特辑)虚拟机常用命令

基础 查看ip&#xff1a;ip addr或ipconfig压缩&#xff1a;tar -zcvf redis-3.2.8.tar.gz redis-3.2.8/ 注意&#xff1a;-zcvf对应gz&#xff0c;-vcf对应tar 解压&#xff1a;tar -zxvf redis-3.2.8.tar.gz查看文件底部内容&#xff1a;tail -n 100 error.log循环查看底部内…

(第三方满意度调研公司)供应商满意度指标设计

设计供应商满意度指标时&#xff0c;需要考虑到供应商与客户之间的关键因素和要素。以下是一些可以包含在供应商满意度调查中的重要指标&#xff1a; 1.产品/服务质量&#xff1a;评估客户对供应商提供的产品或服务质量的满意度。这包括可靠性、耐用性、功能性以及是否符合客户…

docker redis 配置文件样例

文章目录 1. redis的配置文件1.1 chatGPT 写的配置样例及坑点。 2. docker-compose.yml 文件 1. redis的配置文件 redis官方的配置文件样例 非常有用&#xff0c; 都是从官方文档过摘过来的 1.1 chatGPT 写的配置样例及坑点。 #以下配置来自 chatGPT # 设置 Redis 绑定的 IP…

SWUST 派森练习题:P113. 集合操作

描述 txt Ifthereisonlyoneargument,itmustbeadictionarymappingUnicode |ordinals(integers)orcharacterstoUnicodeordinals,stringsorNone. |Characterkeyswillbethenconvertedtoordinals. |Iftherearetwoarguments,theymustbestringsofequallength,and |intheresultingdic…

PHP加密与安全的最佳实践

PHP加密与安全的最佳实践 概述 在当今信息时代&#xff0c;数据安全是非常重要的。对于开发人员而言&#xff0c;掌握加密和安全的最佳实践是必不可少的。PHP作为一种常用的后端开发语言&#xff0c;提供了许多功能强大且易于使用的加密和安全性相关函数和类。本文将介绍一些P…