Linux高阶——1027—守护进程

1、守护进程的基本流程

1、父进程创建子进程,父进程退出

守护进程是孤儿进程,但是是工程师人为创建的孤儿进程,低开销模式运行,对系统没有压力

2、子进程(守护进程)脱离控制终端,创建新会话

3、将守护进程中无用的描述符关闭(STDOUT|STDIN)

将STDERROR重定向到文件中,避免屏幕抛出异常信息,避免在使用前台时,后台的守护进程输出到屏幕上

需要把标准出错也要关闭,STDERR_FILENO,标准出错指的是,当使用open函数打开一个不存在文件时,会在终端上显示出来的错误

重定向函数dup和dup2

错误信息会通过STDERR_FILENO将异常抛出到显示器上,因此需要将错误信息重定向,不使用STDERR_FILENO流,而使用输出错误文件的文件描述符fd流

4、将守护进程的工作路径变为根目录

进程默认的工作目录一般为执行程序目录(app)

将默认工作目录(usb)改为目标电脑的根目录,避免工作目录丢失

5、修改进程umask文件权限掩码,变为0002

一般创建文件,文件权限是0664,6表示所有者权限,6表示同组用户权限,4表示其他人权限

一般电脑上初始权限mod为0666,但要与mask掩码0002做取反求与运算,得到0664

开发机的mod初始权限是0666,电脑权限掩码为0002,但目标主机的默认掩码不一定等于0002

将进程掩码改为0002,当进程创建文件时,创建出的文件掩码一定为0002

6、执行守护进程任务(间隔执行|条件触发|定时触发)

7、守护进程退出处理

测试任务

获取时间函数

用户传入数组地址,此函数将字符串时间写入数组中

设定数组中每个元素为time_t类型的变量tp

使用bzero函数初始化数组

使用time函数获取时间种子,赋值给tp

将时间种子tp传入ctime_r函数,计算出当前时间

ctime_r函数最后的返回值带'\n',因此使用tm[strlen(tm)-1]='\0'将'\n'去除

int Get_time(char* tm) 
{time_t tp; bzero(tm,1024);tp=time(NULL);ctime_r(&tp,tm);tm[strlen(tm)-1]='\0';return 0;
}

创建进程的工作

void daemon_job(void)
{int fd;if((fd=open("system.log",O_RDWR|O_CREAT,0664))==-1){perror("open failed");}char tm[1024];char log_info[4096];while(1){Get_time(tm);sprintf(log_info,"<%s>WARING war informatcion...\n",tm);write(fd,log_info,strlen(log_info));bzero(log_info,sizeof(log_info));bzero(tm,sizeof(tm));sleep(3);}
}

 创建守护进程

int create_daemon(void)
{pid_t pid;int efd;efd=open("ERROR_MSG",O_RDWR|O_CREAT,0664);pid=fork();if(pid>0){exit(0);}else if(pid==0){setsid();close(STDIN_FILENO);close(STDOUT_FILENO);dup2(efd,STDERR_FILENO);chdir("./");umask(0002);daemon_job();}else{perror("fork call failed");}return 0;
}

 总代码

#include<stdio.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<errno.h>
#include<signal.h>
#include<pthread.h>
#include<sys/fcntl.h>
#include<string.h>int Get_time(char* tm) 
{time_t tp; bzero(tm,1024);tp=time(NULL);ctime_r(&tp,tm);tm[strlen(tm)-1]='\0';return 0;
}void daemon_job(void)
{int fd;if((fd=open("system.log",O_RDWR|O_CREAT,0664))==-1){perror("open failed");}char tm[1024];char log_info[4096];while(1){Get_time(tm);sprintf(log_info,"<%s>WARING war informatcion...\n",tm);write(fd,log_info,strlen(log_info));bzero(log_info,sizeof(log_info));bzero(tm,sizeof(tm));sleep(3);}
}int create_daemon(void)
{pid_t pid;int efd;efd=open("ERROR_MSG",O_RDWR|O_CREAT,0664);pid=fork();if(pid>0){exit(0);}else if(pid==0){setsid();close(STDIN_FILENO);close(STDOUT_FILENO);dup2(efd,STDERR_FILENO);chdir("./");umask(0002);daemon_job();}else{perror("fork call failed");}return 0;
}int main()
{create_daemon();return 0;
}

创建一个system.log的日志文件,每隔3秒,向日志文件中写入当前系统时间

eg:<系统时间>WARNING,test war message

2、实现Linux操作系统开机启动

shell脚本

脚本池里有许多脚本,每个脚本可以启动一个程序

虚拟机操作系统LINUX OS启动时,会将脚本池里的所有shell脚本对应的程序启动

编写一个shell脚本,让此脚本可以定位并启动守护程序

步骤:

1、将脚本放进系统脚本文件夹/etc/init.d/

2、将自定义脚本通过update-rc.d加入系统脚本池

3、!/bin/bash声明脚本中使用的shell版本

sudo mv start_daemon /etc/init.d/

cd /etc/init.d

sudo update-rc.d shell_name start 99 2.——添加启动

sudo update-rc.d shell_name remove——删除启动

shell脚本——命令的容器,可以将大量命令写入脚本,最后进行批量执行和处理,有了脚本后使用命令更方便

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

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

相关文章

浔川社团官方联合会入驻后计划公告

浔川社团官方联合会入驻后计划公告 尊敬的浔川社团成员及相关人士&#xff1a; 大家好&#xff01;随着浔川社团官方联合会的入驻&#xff0c;为了更好地协调社团事务&#xff0c;规范发布流程&#xff0c;现将入驻后的计划公告如下&#xff1a; 一、发文流程 接待与编辑 我们…

vue表格单元格数据拖拽互换

帮助兄弟记录下成果&#xff0c;借鉴了https://juejin.cn/post/6844904136056668168 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initia…

Selective Generation for Language Models 语言模型的选择性生成

生成式语言模型&#xff08;Generative Language Models, GLMs&#xff09;在文本生成任务中取得了显著进展。然而&#xff0c;生成内容的“幻觉”现象&#xff0c;即生成内容与事实或真实语义不符的问题&#xff0c;仍是GLMs在实际应用中的一个重大挑战。为了解决这一问题&…

-bash: ./my_rename.sh: /bin/bash^M: bad interpreter: No such file or directory

在windows上写了一个shell脚本&#xff0c;在Linux上执行时报错&#xff0c;然后看下解决办法&#xff1a; 查了下&#xff0c;其实就是windows系统里文件行尾的换行符和Linux不同引起的&#xff0c; sed -i s/\r$// my.sh用这行代码处理一下&#xff0c;就可以正常运行了。 执…

flutter区别于vue的写法

View.dart 页面渲染&#xff1a; 类似于vue里面使用 <template> <div> <span> <textarea>等标签绘制页面, flutter 里面则是使用不同的控件来绘制页面 样式 与传统vue不同的是 flutter里面没有css/scss样式表&#xff0c; Flutter的理念是万物皆…

Python自动化社交媒体内容发布:以微博为例

1. 引言 在当今社交媒体盛行的时代&#xff0c;定期发布内容对于保持账户活跃度非常重要。本文将介绍如何使用Python的Selenium库来实现自动化登录微博并发布内容的过程。 2. 环境准备 Python环境&#xff08;建议版本3.x&#xff09;Chrome浏览器及其对应版本的ChromeDrive…

uniapp 使用 websocket

原理和vue使用是一样的&#xff0c;这里就不多说了&#xff0c;可以去看我之前发的 websocket 的使用 传送门&#xff1a;WebScoket 使用教程 直接看代码&#xff1a; &#xff08;1&#xff09;先创建一个ws的连接。 在各个小程序平台运行时&#xff0c;网络相关的 API 在使…

idea免费安装步骤,(java集成开发环境)超详细

第一步 点击链接下载 百度网盘 请输入提取码 提取码是idea 下载步骤 可设也可不设置 我就没有设置 下一步 就点击安装就大功告成了

SAP RFC 用户安全授权

一、SAP 通讯用户 对于RFC接口的用户&#xff0c;使用五种用户类型之一的“通讯”类型&#xff0c;这种类型的用户没有登陆SAPGUI的权限。 二、对调用的RFC授权 在通讯用户内部&#xff0c;权限对象&#xff1a;S_RFC中&#xff0c;限制进一步可以调用的RFC函数授权&#xff…

大数据-201 数据挖掘 机器学习理论 - 决策树 局部最优 剪枝 分裂 二叉分裂

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

计算机网络-总线型以太网(ethernet)-知识点小结

广域网与局域网区分: 广域网: 广域网不使用局域网技术, 传输介质 主要是光纤和电话线 常见广域网技术 综合业务数字网&#xff08;ISDN&#xff09;、 帧中继&#xff08;Frame Relay&#xff09;、 异步传输模式 局域网: 以太网--ethernet 简介: 是一种总线型局域网技术&#…

透明加密技术是什么?透明加密技术的原理与应用实践(内含代表性软件分享)

触目惊心&#xff01;10大典型间谍案例回顾 张某离职前搜集大量文件资料&#xff0c;甚至拆开电脑主机拷贝文件 私自存有5200份文件资料 其中标注绝密级的59份 机密级848份 秘密级541份 在当今这个信息化高速发展的时代&#xff0c;透明加密技术已不容忽视。那么&#xff…

NLP领域的经典算法和模型

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;经典算法和模型众多&#xff0c;它们在不同任务中发挥着重要作用。以下是一些NLP领域的经典算法和模型的详细介绍&#xff1a; 一、基础模型 词袋模型&#xff08;Bag of Words&#xff0c;BoW&#xff09; 原理&a…

sql server复制一张表(表结构或表数据)SQL语句整理

1. 复制表结构及数据到新表 CREATE TABLE 新表 SELECT * FROM 旧表;这种方法会复制 旧表 中的所有内容到 新表&#xff0c;但新表不会保留原表的主键、自动递增等属性。为了保持这些属性&#xff0c;需要使用 ALTER 语句进行后续处理 2. 只复制表结构到新表 使用条件始终为假…

Spring SPI、Solon SPI 有点儿像(Maven 与 Gradle)

一、什么是 SPI SPI 全名 Service Provider interface&#xff0c;翻译过来就是“服务提供接口”。基本效果是&#xff0c;申明一个接口&#xff0c;然后通过配置获取它的实现&#xff0c;进而实现动态扩展。 Java SPI 是 JDK 内置的一种动态加载扩展点的实现。 一般的业务代…

C/C++ 每日一练:二叉树的先序遍历

二叉树 binary tree 定义 二叉树是一种树状数据结构&#xff0c;非线性数据结构&#xff0c;代表“祖先”与“后代”之间的派生关系&#xff0c;体现了“一分为二”的分治逻辑。与链表类似&#xff0c;二叉树的基本单元是节点&#xff0c;二叉树的每个节点包含三个主要部分&am…

【MySQL工具】pt-archiver

名称 pt-archiver - 将MySQL表中的行归档到另一个表或文件中。 概述 用法&#xff1a;pt-archiver [选项] --source DSN --where WHERE pt-archiver 从MySQL表中逐条处理记录。--source 和 --dest 参数使用DSN&#xff08;数据源名称&#xff09;语法&#xff1b;如果COPY设…

Android webview 打开本地H5项目(Cocos游戏以及Unity游戏)

webview打开本地Html文件 1.在路径前面加上file:// String filePath"file://"path;webView.loadUrl( filePath);2.打开权限 <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE" />3.启用JavaScript 设置本地访问权限 webVi…

OpenCV开发笔记(八十二):两图拼接使用渐进色蒙版场景过渡缝隙

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/143432922 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

Unity程序化生成地形

制作地形&#xff1a; 绘制方块逐个绘制方块并加噪波高度删除Gizmos和逐个绘制 1.draw quad using System.Collections; using System.Collections.Generic; using UnityEngine;[RequireComponent(typeof(MeshFilter))] public class mesh_generator : MonoBehaviour {Mesh m…