linux——守护进程守护刷抖音程序不被意外退出

news2024/11/27 11:55:21

先搞清楚几个概念:

udev:

设备管理工具,以守护进程的方式工作。位于应用层,主要用于监听内核硬件状态,它能够根据系统中的硬

件设备的状态动态更新设备文件,包括设备文件的创建,删除等

守护进程:

  1. 守护进程和终端无关联,也就是他们没有控制终端,所以当控制终端退出,也不会导致守护进程退出

  1. 守护进程是在后台运行,不会占着终端,终端可以执行其他命令

  1. 一个守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出

  1. 了,所以它是一个由init继承的孤儿进程

ps -elf:查看系统进程,一般为d结尾的就是守护进程(用户),带[]的表示内核的守护进程

用守护进程的方式不让刷抖音程序意外退出:

直接借助damon()函数完成

#include <unistd.h>
int daemon(int nochdir, int noclose);
/*函数参数:
nochdir:为0时表示将当前目录更改至“/”,目的是为了和用户目录不挂钩,用户目录一般为/orangepi
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 到 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);//休眠10秒
}
return 0;

}

编译运行上述代码可以看到,运行没有任何结果输出,但是查看系统进程可以发现,有个父进程为1的进程,这个就是编写的守护进程,并且在工作目录底下可以看到日志文件,每隔十秒发送时间相关信息(代码有解析),日志文件内容如下:

实现守护进程开机自启动:

:sudo vi /etc/rc.local(打开这个文件)

:找到守护进程的可执行文件路径(我的是/home/orangepi/tdamon)

把它放进文件里就ok了

:sudo reboot(重启试一下)

成功!

开始实现刷抖音程序的守护进程

第一步:

写个脚本来搜索刷抖音的程序

  1 #include <stdio.h>
  2 #include <string.h>
  3 int main()
  4 {
  5     FILE *file;
  6
  7     char *cmd = "ps -elf|grep shuadouy|grep -v grep";
  8     char buffer[128] = {'\0'};//定义一个128个字节的数组,并且全部初始化为0
  9     file = popen(cmd,"r");//相对于open的好处在于可以读取终端上打印的东西
 10
 11     fgets(buffer,128,file);//在file这个文件里面读取128个字节到buffer里面去
 12
 13     if(strstr(buffer,"shuadouy") != NULL){//在buffer里面判断是否有"shuadouy"这样的字串
 14         printf("shuhadouy pro is running!\n");
 15
 16     }else{
 17         printf("shuhadouy pro is error!\n");
 18
 19
 20     }
 21     printf("buffer:%s\n",buffer);
 22 }

打开和关闭刷抖音程序时:

第二步:把抖音进程和守护进程关联起来

#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <time.h>
#include <stdio.h>
#include <stdbool.h>
#include <signal.h>
static bool flag = true;
int daemon(int nochdir, int noclose);
void handler(int sig)
{
    printf("I got a signal %d\nI'm quitting.\n", sig);
    flag = false;
}


int judMent()
{
    FILE *file;

    char *cmd = "ps -elf|grep shuadouy|grep -v grep";
    char buffer[128] = {'\0'};//定义一个128个字节的数组,并且全部初始化为0
    file = popen(cmd,"r");//相对于open的好处在于可以读取终端上打印的东西

    fgets(buffer,128,file);//在file这个文件里面读取128个字节到buffer里面去

    if(strstr(buffer,"shuadouy") != NULL){//在buffer里面判断是否有"shuadouy"这样的字串
        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(judMent() == -1){
            system("/home/orangepi/douyin/shuadouy /dev/ttyS5 &");//&代表后台运行

        }
        sleep(2);
    }
    return 0;

}

结果就是:

守护进程能跑起来,而且杀不掉,杀掉又会重新来一个id

加入上电自启动:

把守护进程和刷抖音的程序都加进来

全部完成

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

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

相关文章

vue 最详细教学篇(三)

文章目录vue2-cli 项目文件分析示例项目解析router-linkrouterrouter-viewmain.jspackage.jsonvue2-cli 项目 vue-cli>> 文件分析 从上图分析项目文件 1. node_modules // npm 所有下载文件包都在里面 2. public // 根目录文件, 存放index.html和一些脚本文件 3. sr…

CSDN每日一练:小桥流水人家

题目名称&#xff1a;小桥流水人家 时间限制&#xff1a;1000ms内存限制&#xff1a;256M 题目描述 在n*m的地图上&#xff0c;存在一个喷水点(x,y). 如果相邻的位置低于有水的地方&#xff0c;水就能流到相邻的某位置。 已知各个地方的海拔高度&#xff0c;求水的最大覆盖个格…

[js基础]ECMAScript2015(ES6)精要知识点(下)

模块化模块就是在单个文件中声明的JavaScript代码。我们可以用JS代码直接从其他文件中导入函数、变量和类。在NodeJS之前&#xff0c;由于没有过于复杂的开发场景&#xff0c;前端是不存在模块化的&#xff0c;后端才有模块化。NodeJS诞生之后&#xff0c;它使用CommonJS的模块…

filebrowser logo和样式自定义及免密访问

这两天接到项目一个需求&#xff0c;客户需要文件管理存储服务&#xff0c;看了下大概的功能&#xff0c;计划用源码开发的&#xff0c;但是看后期这块调整也不大&#xff0c;就采用开源的项目进行即可&#xff0c;开源项目对比后&#xff0c;发现filebrowser比较适合我&#x…

Spring如何解决循环依赖

今天面试了同程旅行&#xff0c;面试官问到了这个问题&#xff0c;所以今天来总结学习一下 Spring是如何解决循环依赖问题&#xff1f; 前言 Spring的依赖注入分为 setter注入和 构造器注入 这里说的解决循环依赖主要指的是&#xff1a;单例模式下的setter循环依赖 如果是&a…

ThreadLocal使用与原理

目录一、ThreadLocal1.ThreadLocal简介1.1 是什么2.能干嘛1.3 api介绍1.4 实战1.5 通过上面代码总结2.从阿里ThreadLocal规范开始3.ThreadLocal源码分析3.1 Thread&#xff0c;ThreadLocal&#xff0c;ThreadLocalMap 关系3.2 总结4.ThreadLocal内存泄露问题4.1 什么是内存泄漏…

PCIE 学习笔记(入门简介)

PCIE 学习笔记书到用时方恨少啊&#xff0c;一年前学PCIE的笔记&#xff0c;再拿出来瞅瞅。发到博客上&#xff0c;方便看。PCIE基础PCIE和PCI的不同PCIE采用差分信号传输&#xff0c;并且是dual-simplex传输——每条lane上有TX通道和RX通道&#xff0c;所以每条lane上的信号是…

DBeaver连接达梦数据库

1、下载Dbeaver安装包 1、官网下载&#xff1a;Download | DBeaver Community 2、下载完成后双击运行.exe文件&#xff0c;进行安装 2、配置达梦数据库驱动 1、达梦数据库驱动下载&#xff1a;Mybatis 框架 | 达梦技术文档 2、为DBeaver添加驱动 3、自定义DM驱动管理器的相关配…

购买低代码平台,要考量哪些指标?

近些年来&#xff0c;低代码平台的热度在逐渐上升&#xff0c;可以看出企业数字化转型得速度也在逐渐加快。企业的数字开发需求越来越强&#xff0c;市场之间的竞争也愈演愈烈。特别是对于中小型企业&#xff0c;既要考虑到产品功能需求&#xff0c;又要考虑成本压力&#xff0…

安卓小游戏:飞机大战

安卓小游戏&#xff1a;飞机大战 前言 前面写了十二篇自定义view的博客&#xff0c;说实话写的还是有点无聊了&#xff0c;最近调整了一下&#xff0c;觉得还是要对开发有热情&#xff0c;就写了点小游戏&#xff0c;现在抽时间把博客也写一写&#xff0c;希望读者喜欢。 需…

渲染速度特别慢,使用云渲染会快多少?

设计师在使用软件制作效果图和动画师在制作动画时&#xff0c;其中有一个比较关键的环节就是渲染成像&#xff0c;渲染的效率主要跟使用的电脑显卡或CPU性能有关&#xff0c;如果性能太低&#xff0c;渲染的速度会很慢&#xff0c;拉长了项目整体的交付周期&#xff0c;云渲染速…

反转链表的两种方法

大家好&#xff0c;今天和大家分享的是反转链表的两种方法&#xff0c;第一种是用泛型编程里面的STL&#xff0c;第二种是利用多个指针进行操作&#xff0c;小孩子才做选择&#xff0c;建议两个都学。我们往下看&#xff1a;一.使用vector容器ps&#xff1a;该方法对内存的需求…

LeetCode刷题--- 430. 扁平化多级双向链表(双指针)

文章目录一、编程题&#xff1a;430. 扁平化多级双向链表&#xff08;双指针&#xff09;1.题目描述2.示例1&#xff1a;3.示例2&#xff1a;4.示例3&#xff1a;5.提示&#xff1a;二、解题思路1.思路2.复杂度分析&#xff1a;3.算法图解三、代码实现总结一、编程题&#xff1…

网页防篡改实验(6)

实验简介 实验所属系列&#xff1a;网络攻防工具 实验对象&#xff1a; 本科/专科信息安全专业 相关课程及专业&#xff1a;信息网络安全概论、计算机网络 实验时数&#xff08;学分&#xff09;&#xff1a;2学时 实验类别&#xff1a;实践实验类 实验目的 1、了解网页防篡改…

7.数据库设计

学习过程参考&#xff08;后续章节同&#xff09; 【公开课】数据库系统概论&#xff08;王珊老师&#xff09;&#xff08;完结&#xff09; 《数据库系统概论》思维导图 第7章 数据库设计 | 数据库知识点整理 梳理 名词解释 数据库设计(database design)&#xff1a;数据库…

从2023年31省级政府工作报告看数据安全赛道 | 附下载

数字经济是支撑我国经济增长的新动能。据中国信息通信研究院数据&#xff0c;2021年我国数字经济规模超45万亿元、在GDP已占比40%&#xff0c;到2025年我国数字经济规模预计超60万亿元。春节前夕&#xff0c;地方两会陆续召开&#xff0c;从各地发布的2022年经济社会发展成绩来…

NodeJS与npm版本不一致时降级npm的方法

首先查看 Node.js 与 npm 版本对应关系&#xff1a;Node.js与npm版本查看。 安装 cnpm&#xff1a; npm install -g cnpm 查看一下 npm 和 cnpm 的镜像&#xff1a; npm config get registry cnpm config get registry 2 如果不是 https://registry.npm.taobao.org/ 的话就修…

【C++】CC++内存管理

就是你被爱情困住了&#xff1f;Wake up bro&#xff01; 文章目录一、C/C内存分布二、C语言中动态内存管理方式三、C中内存管理方式1.new和delete操作内置类型2.new和delete操作自定义类型&#xff08;仅限vs的底层实现机制&#xff0c;new和delete一定要匹配使用&#xff0c;…

【Linux】TCP网络编程流程

TCP网络编程流程 上一节博文我们提到了网络编程的基本流程 现在我们来了解TCP网络编程的流程 在这之前我们先要了解TCP 首先TCP是一种传输控制协议 在因特网协议族&#xff08;Internet protocol suite&#xff09;中&#xff0c;TCP层是位于IP层之上&#xff0c;应用层之…

MIT 6.S965 韩松课程 02

Lecture 02: Basics of Neural Networks TitleBasics of Neural NetworksLecturerSong HanDate09/13/2022Note AuthorGuangxuan Xiao (xgx)DescriptionReview the basics of deep learning and introduce efficiency metrics for neural networks. 回顾深度学习的基础知识&…