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

news2024/11/23 14:53:28

一、守护进程
二、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 到 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\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.coloradmin.cn/o/1207333.html

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

相关文章

cesium 自定义顶点属性

// 创建平面const planeGeometry new Cesium.PlaneGeometry({vertexFormat: Cesium.VertexFormat.POSITION_AND_ST, // 位置和UV});const geometry Cesium.PlaneGeometry.createGeometry(planeGeometry);// [3]-----[2]// | |// [0]-----[1]geometry.attributes.color…

Django 的国际化与本地化详解

概要 随着全球化的发展&#xff0c;为 Web 应用提供多语言支持变得日益重要。Django 作为一个功能强大的 Web 框架&#xff0c;提供了一套完整的国际化&#xff08;i18n&#xff09;和本地化&#xff08;l10n&#xff09;工具&#xff0c;使得开发多语言应用变得简单。本文将详…

Sui上TVL突破1.28亿美金,浅谈DeFi续创新高背后的基础知识

根据财富商业洞察研究&#xff0c;DeFi市场预计从2022年的555.8亿美元增长到2030年的3370.4亿美元。推动这一增长的活动包括对token的交易、借贷和借款&#xff0c;这通常是点对点的&#xff0c;无需传统金融机构的参与。随着Sui网络于今年五月份启动主网和其SUI token&#xf…

稳定扩散 img2img 的工作原理

在线工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 3D数字孪生场景编辑器 在本教程中&#xff0c;我将介绍&#xff1a; 这种技术在实践中有用的几种方式当您提供输入图像时&#xff0c;模型内部实际发生的…

第二章 (导数与微分)

导数简介 路程与时间关系函数 就是 速度与时间关系函数 的 原函数。 路程与时间关系函数 求导 &#xff08;或者叫导函数&#xff09; —————求导—————> 就是 vt关系的导数 求导得到》导函数 导函数积分 得到 原函数 你一开始速度为0&#xff0c;然后速度不断…

绘图软件 OmniGraffle mac中文版特点说明

OmniGraffle mac是一款图形绘制和图表设计软件&#xff0c;主要面向 macOS 和 iOS 平台。它适用于用户创建流程图、组织结构图、原型设计、网站线框图、地图等各种类型的图形。该软件的界面直观&#xff0c;用户友好&#xff0c;让用户能够轻松地创建和编辑复杂的图形。 OmniGr…

计算图片中两个任意形状多边形相交部分的大小

一张图片中两个任意多边形相交的面积计算方法。本文参考https://blog.csdn.net/PanYHHH/article/details/110940428&#xff1b;加了一个简单的示例&#xff0c;也对代码做了一点清淅化。原博客中还有其他链接&#xff0c;是C代码&#xff0c;没有看原理&#xff0c;但以下代码…

漏洞复现--IP-guard flexpaper RCE

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

亚马逊、Shein、lazada自养号测评如何解决支付和环境问题?

年底旺季&#xff0c;平台风控都会大规模持续升级&#xff0c;针对风控升级如果测评环境没有进行相对应的更新可能会导致大批量砍单&#xff0c;或者F号&#xff0c;严重的店铺还会被关联。有人以为是支付卡的问题&#xff0c;也有人觉得是IP被关联了。其实他们讲的也没错&…

Vue computed 计算属性

1.计算属性的相关知识 概念 &#xff1a;基于现有的数据&#xff0c;计算出来的新属性。依赖数据的变化&#xff0c;自动重新计算。 语法&#xff1a; ① 声明在 computed 配置项 中&#xff0c;一个计算属性对应一个函数 ② 使用起来和普通属性一样使用 {{ 计算属性名 …

从搜索到社交,跨境电商独立站引流全攻略!

不少跨境电商卖家除了入驻电商平台外&#xff0c;还会搭建自己的独立站&#xff0c;独立站相对于其他平台&#xff0c;限制比较少&#xff0c;而且操作也是比较自由&#xff0c;但是也有卖家在做独立站的时候&#xff0c;不知道要怎么做引流。现在为卖家们分享独立站引流方法&a…

跟踪工作时间如何使企业节省资金?

企业主都希望自己的员工每天都为公司的利益而高效工作。 但随着公司的发展壮大&#xff0c;要了解每个人都在做什么、把时间花在哪就变得更加困难了。而不清楚员工每天在做什么可能会容易造成公司运营效率低下且浪费。 为了确保这种情况不会发生&#xff0c;企业主可以让员工…

2023年【汽车驾驶员(高级)】复审模拟考试及汽车驾驶员(高级)实操考试视频

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 汽车驾驶员&#xff08;高级&#xff09;复审模拟考试参考答案及汽车驾驶员&#xff08;高级&#xff09;考试试题解析是安全生产模拟考试一点通题库老师及汽车驾驶员&#xff08;高级&#xff09;操作证已考过的学员…

一起学docker系列之一为什么要学习docker--从混乱到协调:Docker在开发和运维中的崭露头角

目录 1 常见的开发场景2 保持环境一致性的传统做法3 Docker与传统容器虚拟机的比较3.1 虚拟化技术3.2 资源消耗3.3 启动时间3.4 管理和部署3.5 隔离3.6 移植性 4 Docker技术的优势5 结语 1 常见的开发场景 在软件开发中&#xff0c;开发人员和运维人员之间的合作是至关重要的。…

sqlserver查询时去除1900-01-01

在下图示例中“chk_date”字段在数据中显示的是默认时间&#xff0c;如何将这个时间在SQL查询时设为空&#xff1f; cast(nullif(a.chk_date,) as datetime) 确认日期 以上是我的方法。 select chk_date as 日期 from Ixa_payment_req 运行结果是&#xff1a;1900-01-01 00:0…

java导出excel思路

1、构建导出的数据模型&#xff0c; 这个模型可以自己画&#xff0c;也可以读取一个自己制作好的模板&#xff0c;根据模板填充数据&#xff0c;然后flush到一个新的excel文件。 1&#xff09;、自己画 GetMapping("/exportTemplate") public void exportTemp…

交直流钳式电流探头的功能介绍

有三种常用技术可用于测量电流&#xff0c;包括串联电阻测量法(也称为分流电阻测量法)、电流互感器测量法和电流探头测量法。这些方法都要求被测电流通过测量传感器&#xff0c;因此它们属于侵入式测量技术。 电流探头是一种非侵入性技术&#xff0c;可以用来测量导线电流&…

Android面试官の小抄,可能是东半球最好的

面试官的小抄&#xff0c;Android面试&进阶一网打尽&#xff0c;让一部分人先学起来 背景 作为一名客户端开发者&#xff0c;能够明显的感觉到小程序这些年对原生市场带来的压迫感&#xff0c;比如现在的创业公司都是小程序探路&#xff0c;成熟了再推进客户端&#xff0…

管理类联考——数学——汇总篇——知识点突破——代数——函数、方程——记忆——一元二次函数

——一元二次函数——【图像→交点】 ——【 a x 2 b x c y ax^2bxcy ax2bxcy二次函数核心在于“图像”&#xff1a;整体可以由&#xff1a; 图像&#xff08;形状&#xff0c;上下&#xff0c;交点&#xff09; ⟹ \Longrightarrow ⟹ △ △ △ ⟹ \Longrightarrow ⟹ 抛…

青少年编程学习 等级考试 信奥赛NOI/蓝桥杯/NOC/GESP等比赛资料合集

一、博主愚见 在当今信息技术高速发展的时代&#xff0c;编程已经成为了一种必备的技能。随着社会对于科技人才的需求不断增加&#xff0c;青少年编程学习正逐渐成为一种趋势。为了更好地帮助青少年学习编程&#xff0c;提升他们的技能和素质&#xff0c;博主结合自身多年从事青…