守护进程编程

一、守护进程

守护进程的含义:
守护进程是计算机中的一种特殊后台服务进程,通常在系统启动时自动运行,独立于用户终端,长期驻留在系统中执行特定任务。守护进程是操作系统服务可靠性的关键,确保核心功能持续可用而不受用户操作干扰。
在后台运行,不依赖用户交互,无控制终端,默默执行任务。其生命周期长,从系统启动到关闭持续运行,除非手动终止或遇到错误。且为其他程序或用户提供基础服务。

编程实现守护进程的主要过程:
1.fork创建子进程,并退出父进程
2.调用 setsid() 函数创建新会话
3.再次 fork
4.调用 chdir() 函数,更改工作目录
5.重设文件权限掩码
6.关闭所有打开的文件描述符,重定向标准输入/输出/错误
7.退出处理

二、创建守护进程

1.nohup命令

编写脚本:
#!/bin/bash
while true; do
echo “Running daemon task…” >> /tmp/daemon.log
sleep 10
done
赋予脚本执行权限:
chmod +c loop.sh
启动守护进程:
nohup ./loop.sh > /dev/null 2>&1 &
![[Pasted image 20250420223838.png]]

2.fork()函数

编写一个C程序:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>

void daemonize() {
pid_t pid = fork();
if (pid < 0) {
perror(“fork failed”);
exit(EXIT_FAILURE);
}
if (pid > 0) {
// 父进程退出
exit(EXIT_SUCCESS);
}

// 子进程继续运行
setsid(); // 创建新会话
chdir("/"); // 改变工作目录
umask(0); // 重设文件权限掩码// 关闭标准输入输出流
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);// 执行守护任务
while (1) {FILE *fp = fopen("/tmp/daemon_fork.log", "a");fprintf(fp, "Daemon running...\n");fclose(fp);sleep(10);
}

}

int main() {
daemonize();
return 0;
}

![[Pasted image 20250420224241.png]]

编译:
gcc -o fork_test fork_test.c
运行守护进程:
./fork_test
![[Pasted image 20250420224420.png]]

3.daemon()函数

编写一个C程序:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
// 调用 daemon() 函数
if (daemon(1, 0) == -1) {
perror(“daemon failed”);
exit(EXIT_FAILURE);
}

// 执行守护任务
while (1) {FILE *fp = fopen("/tmp/daemon_builtin.log", "a");fprintf(fp, "Daemon running...\n");fclose(fp);sleep(10);
}return 0;

}

编译:
gcc -o daemon_test daemon_test.c
运行守护进程:
./daemon_test
![[Pasted image 20250420224715.png]]

三、gdb命令

编写一个C程序:(简单加法)
#include <stdio.h>

int add(int a, int b) {
return a + b;
}

int main() {
int x = 1;
int y = 2;
printf(“Sum is %d\n”, add(x, y));
return 0;
}

编译:
gcc -g -o test gdb_test.c
启动:
gdb ./test

![[Pasted image 20250420225115.png]]

设置断点:break add
运行: run
![[Pasted image 20250420225427.png]]

退出:
quit

四、SSH反向代理

检查ssh:(树莓派、阿里云)
sudo systemctl status ssh
检查端口:(阿里云)
sudo netstat -tuln | grep 9624
建立 SSH反向代理:(树莓派)
ssh -R 9624:localhost:22 yaox@114.55.126.125
从外网访问树莓派:
ssh -p 9624 yaox@114.55.126.125

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

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

相关文章

JUC复习及面试题学习

资源来自沉默王二、小林coding、竹子爱熊猫、代码随想录 一、JUC 1、进程与线程 进程是对运行程序的封装&#xff0c;是系统进行资源调度和分配的最小单位。 线程是进程的子任务&#xff0c;是CPU调度分配的基本单位 不同的进程之间很难数据共享&#xff0c;同进程下的不同线…

python-图片分割

图片分割是图像处理中的一个重要任务&#xff0c;它的目标是将图像划分为多个区域或者对象&#xff0c;例如分割出物体、前景背景或特定的部分。在 Python 中&#xff0c;常用的图片分割方法包括传统的图像处理技术&#xff08;例如阈值分割、区域生长等&#xff09;和深度学习…

STM32嵌入式

一、创建工程项目 1、进入软件首页 2、新建项目,【file】->【new project】 3、选择需要的芯片 4、系统内核部分设置 ① 选择晶振&#xff08;使用外部的高速晶振&#xff09; ② 选择debug形式&#xff08;SW类型&#xff09; 5、时钟设置 6、选择自己需要的引脚设置&a…

7.QT-常用控件-QWidget|font|toolTip|focusPolicy|styleSheet(C++)

font API说明font()获取当前widget的字体信息.返回QFont对象.setFont(const QFont& font)设置当前widget的字体信息. 属性说明family字体家族.⽐如"楷体",“宋体”,"微软雅⿊"等.pointSize字体⼤⼩weight字体粗细.以数值⽅式表⽰粗细程度取值范围为[…

蓝桥杯之前缀和

一维前缀 解题思路 看到“区间之和”问题&#xff0c;直接想到“前缀和” 前缀和的核心公式&#xff1a; sum[i]sum[i−1]a[i] 利用前缀和求区间和 [l,r] 的公式&#xff1a; 区间和sum[r]−sum[l−1] 解题步骤模板 输入数组&#xff1a; 读取数组长度 n 和查询次数 m。 读…

⭐ Unity 使用Odin Inspector增强编辑器的功能:UIManager脚本实例

先看一下测试效果&#xff1a; 在Unity开发中&#xff0c;Odin Inspector已经成为了一个非常受欢迎的工具&#xff0c;它通过增强编辑器的功能&#xff0c;使得开发者在工作中更加高效&#xff0c;尤其是在处理复杂数据和自定义编辑器方面。今天&#xff0c;我们将通过一个简…

JBoss + WildFly 本地开发环境完全指南

JBoss WildFly 本地开发环境完全指南 本篇笔记主要实现在本地通过 docker 创建 JBoss 和 WildFly 服务器这一功能&#xff0c;基于红帽的禁制 EAP 版本的重新分发&#xff0c;所以我这里没办法放 JBoss EAP 的 zip 文件。WildFly 是免费开源的版本&#xff0c;可以在红帽官网找…

IDEA使用jclasslib Bytecode Viewer查看jvm字节码

学习jvm的时候&#xff0c;想查看字节码和局部变量表&#xff0c;可以使用idea安装jclasslib Bytecode View插件查看。 &#xff08;1&#xff09;安装工具&#xff1a; 安装完成后需要重启idea. &#xff08;2&#xff09;准备一段代码&#xff0c;编译运行 package com.te…

STM32控制DRV8825驱动42BYGH34步进电机

最近想玩一下人工智能&#xff0c;然后买了个步进电机想玩一下&#xff0c;刚到了一脸懵逼&#xff0c;发现驱动器20多块&#xff0c;有点超预算&#xff0c;然后整了个驱动板&#xff0c;方便自己画线路板&#xff0c;经过各种搜索&#xff0c;终于转起来了&#xff0c;记录一…

第十四节:实战场景-何实现全局状态管理?

React.createElement调用示例 Babel插件对JSX的转换逻辑 React 全局状态管理实战与 JSX 转换原理深度解析 一、React 全局状态管理实现方案 1. Context API useReducer 方案&#xff08;轻量级首选&#xff09; // 创建全局 Context 对象 const GlobalContext createConte…

QT网络拓扑图绘制实验

前言 在网络通讯中&#xff0c;我qt常用的是TCP或者UDP协议&#xff0c;就比方说TCP吧&#xff0c;一台服务器有时可能会和多台客户端相连接&#xff0c;我之前都是处理单链接情况&#xff0c;最近研究图结构的时候&#xff0c;突然就想到了这个问题。那么如何解决这个问题呢&…

【深度学习—李宏毅教程笔记】各式各样的 Attention

目录 一、普通 Self-Attention 的痛点 二、对 Self-Attention 的优化方式 1、Local Attention / Truncated Attention 2、Stride Attention 3、Global Attention 4、知名的 Self-Attention 的变形的应用 &#xff08;1&#xff09;Longformer &#xff08;2&#xff09…

OceanBases数据库单机社区版保姆级安装

目录 背景 简介 安装 OceanBase 下载地址 上传解压安装包 ​编辑 执行安装命令 ​编辑 应用环境配置 执行以下命令&#xff0c;快速部署 OceanBase 数据库(仅用于简单使用&#xff0c;不应用于生产)。 查看一下数据库状态 ​编辑连接数据库 用户创建 使用工具Navi…

Linux守护进程

一、相关概念 QQ邮箱关于三种协议的解释&#xff1a;SMTP/IMAP服务 1.SMTP协议 SMTP&#xff08;​​Simple Mail Transfer Protocol​​&#xff0c;简单邮件传输协议&#xff09;是一种用于发送电子邮件的互联网标准。它在TCP/IP协议族中&#xff0c;通常使用25端口进行通…

Java【网络原理】(4)HTTP协议

目录 1.前言 2.正文 2.1自定义协议 2.2HTTP协议 2.2.1抓包工具 2.2.2请求响应格式 2.2.2.1URL 2.2.2.2urlencode 2.2.3认识方法 2.2.3.1GET与POST 2.2.3.2PUT与DELETE 2.2.4请求头关键属性 3.小结 1.前言 哈喽大家好啊&#xff0c;今天来继续给大家带来Java中网络…

【版本控制】idea中使用git

大家好&#xff0c;我是jstart千语。接下来继续对git的内容进行讲解。也是在开发中最常使用&#xff0c;最重要的部分&#xff0c;在idea中操作git。目录在右侧哦。 如果需要git命令的详解&#xff1a; 【版本控制】git命令使用大全-CSDN博客 一、配置git 要先关闭项目&#xf…

【中间件】redis使用

一、redis介绍 redis是一种NoSQL类型的数据库&#xff0c;其数据存储在内存中&#xff0c;因此其数据查询效率很高&#xff0c;很快。常被用作数据缓存&#xff0c;分布式锁 等。SpringBoot集成了Redis&#xff0c;可查看开发文档Redis开发文档。Redis有自己的可视化工具Redis …

一文粗通 Celery 分布式任务队列

目录 简介什么是 CeleryCelery 的基本组成Celery 的应用场景快速开始 设置热重载开发脚本基本任务管理绑定任务本身设置任务的执行超时时间允许任务重试自定义任务名称实现任务优先级 高级任务管理任务延迟执行指定时间执行任务超时自动取消任务优先级重试任务 任务链与工作流简…

知识了解03——怎么解决使用npm包下载慢的问题?

1、为什么使用npm下载包会下载的慢 因为使用npm下载包时&#xff0c;默认使用国外服务器进行下载&#xff0c;此时的网络传输需要经过漫长的海底电缆&#xff0c;因此下载速度会变慢 2、怎么解决&#xff1f;&#xff08;切换镜像源&#xff09; &#xff08;1&#xff09;方…

系统思考与理性决策

汉诺贝克在《逆向投资心理学&#xff1a;引发市场波动的非技术因素分析》书中提到&#xff1a;“心理造就90%的行情。投资者利用别人的愚蠢所获得的利益&#xff0c;往往比靠自己得到智慧来得多。避免跟风&#xff0c;我觉得可以降低或者识别绝大部分的陷阱和风险。”这一观点深…