守护进程编程、GDB调试以及外网连接树莓派

目录

    • 一、什么是守护进程以及如何创建守护进程
      • 1. 什么是守护进程?
      • 2. 如何创建守护进程?
    • 二、什么是GDB调试以及如何用GDB命令调试C程序
      • 1. 什么是GDB?
      • 2. 如何用GDB命令调试C程序?
    • 三、外网访问树莓派

一、什么是守护进程以及如何创建守护进程

1. 什么是守护进程?

守护进程(Daemon Process)是一种特殊的后台进程,它独立于控制终端,并且周期性地执行某种任务或者等待处理特定事件。守护进程通常在系统启动时开始运行,直到系统关闭才结束,它们为系统提供各种服务,例如 Web 服务器、邮件服务器、日志记录等

2. 如何创建守护进程?

编程实现守护进程的主要过程:

  1. 创建子进程并终止父进程:通过 fork() 创建子进程,父进程退出,子进程继续运行。
  2. 创建新的会话:调用 setsid() 创建新的会话,使进程成为会话领导者,从而脱离原来的终端。
  3. 改变工作目录:通常将工作目录更改为根目录 /,避免因原工作目录被卸载而导致的进程终止。
  4. 重设文件权限掩码:调用 umask(0) 设置适当的文件权限掩码,确保守护进程创建的文件具有正确的权限。
  5. 关闭文件描述符:关闭所有不需要的文件描述符,避免资源泄漏。
  6. 重定向标准输入、输出和错误:将标准输入、输出和错误重定向到 /dev/null 或日志文件。
  7. 进入主循环:守护进程进入主循环,周期性地执行任务。

创建一个守护进程的三种方法:
由于阿里云服务器暂时无法登录,所以下面只展示在树莓派上的操作。

  1. 使用 nohup 命令
    在阿里云服务器或树莓派上,可以使用以下命令创建守护进程:
nohup ./your_program > output.log 2>&1 &

在这里插入图片描述

nohup 使程序忽略 SIGHUP 信号,即使终端关闭,程序也会继续运行。
>” 将标准输出重定向到 output.log 文件。
2>&1 将标准错误也重定向到标准输出。
& 将程序放到后台运行。

  1. 使用 fork() 函数
    以下是一个使用 fork() 函数创建守护进程的 C 程序示例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>void daemonize() {pid_t pid = fork();if (pid < 0) {perror("fork");exit(EXIT_FAILURE);}if (pid > 0) {exit(EXIT_SUCCESS); // 父进程退出}// 创建新会话if (setsid() < 0) {perror("setsid");exit(EXIT_FAILURE);}// 改变工作目录if (chdir("/") < 0) {perror("chdir");exit(EXIT_FAILURE);}// 设置文件权限掩码umask(0);// 再次创建子进程并退出父进程pid = fork();if (pid < 0) {perror("fork");exit(EXIT_FAILURE);}if (pid > 0) {exit(EXIT_SUCCESS); // 父进程退出}// 关闭文件描述符close(STDIN_FILENO);close(STDOUT_FILENO);close(STDERR_FILENO);
}int main() {daemonize();while (1) {sleep(1); // 守护进程的主循环}return 0;
}

在阿里云服务器或树莓派上,编译并运行该程序:

gcc -o daemon_fork daemon_fork.c
./daemon_fork

在这里插入图片描述

  1. 使用 daemon() 函数
    以下是一个使用 daemon() 函数创建守护进程的 C 程序示例:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>int main() {if (daemon(0, 0) == -1) {perror("daemon");return EXIT_FAILURE;}while (1) {sleep(1); // 守护进程的主循环}return 0;
}

在阿里云服务器或树莓派上,编译并运行该程序:

gcc -o daemon_daemon daemon_daemon.c
./daemon_daemon

在这里插入图片描述

二、什么是GDB调试以及如何用GDB命令调试C程序

1. 什么是GDB?

GDB 全称“GNU symbolic debugger”,从名称上不难看出,它诞生于 GNU 计划(同时诞生的还有 GCC、Emacs 等),是 Linux 下常用的程序调试器。发展至今,GDB 已经迭代了诸多个版本,当下的 GDB 支持调试多种编程语言编写的程序,包括 C、C++、Go、Objective-C、OpenCL、Ada 等。实际场景中,GDB 更常用来调试 C 和 C++ 程序。
总的来说,借助 GDB 调试器可以实现以下几个功能:
程序启动时,可以按照我们自定义的要求运行程序,例如设置参数和环境变量;
可使被调试程序在指定代码处暂停运行,并查看当前程序的运行状态(例如当前变量的值,函数的执行结果等),即支持断点调试;
程序执行过程中,可以改变某个变量的值,还可以改变代码的执行顺序,从而尝试修改程序中出现的逻辑错误。

2. 如何用GDB命令调试C程序?

1. 安装 GDB
在阿里云服务器或树莓派上,可以通过以下命令安装 GDB:

sudo apt-get update
sudo apt-get install gdb

安装完成后,可以通过运行 gdb --version 来验证是否安装成功
在这里插入图片描述

2. 编写和编译 C 程序
设计一个简单的 C 程序 example.c

#include <stdio.h>
int main() {int a = 5;int b = 10;int c = a + b;printf("The result is: %d\n", c);return 0;
}

为了能够使用 GDB 进行调试,需要在编译时加入 -g 选项,这样编译器会在生成的可执行文件中包含调试信息:

gcc -g -o example example.c

这将生成一个名为 example 的可执行文件

3. 使用 GDB 进行调试
有了带调试信息的可执行文件后,就可以使用 GDB 进行调试了。
启动 GDB
在终端中运行以下命令启动 GDB,并加载可执行文件:

gdb example

设置断点
在调试过程中,设置断点是非常重要的步骤。断点可以让程序在执行到某一行时暂停,方便查看和修改变量值。在 GDB 中,可以使用 break 命令设置断点,例如:

break main

这将设置一个断点在 main 函数的入口处。也可以在特定的行号或函数处设置断点,例如:

break example.c:10

运行程序
设置好断点后,可以使用 run 命令运行程序:

run

程序会在遇到断点时暂停,此时可以查看和修改变量的值
查看和修改变量
在程序暂停时,可以使用 print 命令查看变量的值,例如:

print a

如果需要修改变量的值,可以使用 set 命令,例如:

set var a = 20

继续执行程序
在查看和修改变量后,可以使用 continue 命令继续执行程序:

continue

三、外网访问树莓派

  1. 打开端口的防火墙
sudo ufw allow 9623

将9623设为反向代理的端口

  1. 设置SSH配置文件
GatewayPorts yes

然后重启 SSH 服务:

sudo systemctl restart ssh
  1. 通过putty程序ssh连接树莓派
    在这里插入图片描述
  2. 登录树莓派后设置SSH反向代理
ssh -p 22 -qngfNTR [端口号]:localhost:22 [用户名]@[IP]

在这里插入图片描述

  1. 在阿里云服务器上查看监听端口
ss -ntl

在这里插入图片描述
有红框中的端口就说明服务器和树莓派成功连接

  1. 其他用户通过ssh命令连接到树莓派
ssh -p [你绑定的端口号] [树莓派用户]@云服务器地址

在这里插入图片描述
可以看见其他用户也能连接到树莓派上了

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

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

相关文章

Logisim数字逻辑实训——计数器设计与应用

4位递增计数器 六进制计数器 十进制计数器 六十进制计数器 二十四进制计数器 计时器

发现“横”字手写有难度,对比两个“横”字

我发现手写体“横”字“好看”程度&#xff0c;难以比得上印刷体&#xff1a; 两个从方正简体启体来的“横”字&#xff1a; 哪个更好看&#xff1f;我是倾向于左边一点。 <div style"transform: rotate(180deg); display: inline-block;"> 左边是我从方正简…

ubuntu 向右拖动窗口后消失了、找不到了

这是目前单显示器的设置&#xff0c;因为实际只有1个显示器&#xff0c;之前的设置如下图所示&#xff0c;有2个显示器&#xff0c;一个主显示器&#xff0c;一个23寸的显示器 ubuntu 22.04 系统 今天在操作窗口时&#xff0c;向右一滑&#xff0c;发现这个窗口再也不显示了、找…

专精特新政策推动,B端UI设计如何赋能中小企业创新发展?

在当前数字化转型浪潮下&#xff0c;专精特新政策为中小企业提供了强大的支持&#xff0c;助力其在细分领域实现专业化、精细化、特色化和创新化发展。B端UI设计作为提升企业数字化产品用户体验和工作效率的重要手段&#xff0c;能够有效赋能中小企业创新发展。本文将探讨专精特…

梯度下降代码

整体流程 数据预处理:标准化->加一列全为1的偏置项 训练:梯度下降,将数学公式转换成代码 预测 模型代码 import numpy as np# 标准化函数&#xff1a;对特征做均值-方差标准化 # 返回标准化后的特征、新数据的均值和标准差&#xff0c;用于后续预测def standard(feats…

RAG 实战|用 StarRocks + DeepSeek 构建智能问答与企业知识库

文章作者&#xff1a; 石强&#xff0c;镜舟科技解决方案架构师 赵恒&#xff0c;StarRocks TSC Member &#x1f449; 加入 StarRocks x AI 技术讨论社区 https://mp.weixin.qq.com/s/61WKxjHiB-pIwdItbRPnPA RAG 和向量索引简介 RAG&#xff08;Retrieval-Augmented Gen…

从零开始学A2A一:A2A 协议的高级应用与优化

A2A 协议的高级应用与优化 学习目标 掌握 A2A 高级功能 理解多用户支持机制掌握长期任务管理方法学习服务性能优化技巧 理解与 MCP 的差异 分析多智能体场景下的优势掌握不同场景的选择策略 第一部分&#xff1a;多用户支持机制 1. 用户隔离架构 #mermaid-svg-Awx5UVYtqOF…

【C++】入门基础【上】

目录 一、C的发展历史二、C学习书籍推荐三、C的第一个程序1、命名空间namespace2、命名空间的使用3、头文件<iostream>是干什么的&#xff1f; 个人主页<—请点击 C专栏<—请点击 一、C的发展历史 C的起源可以追溯到1979年&#xff0c;当时Bjarne Stroustrup(本…

1panel第三方应用商店(本地商店)配置和使用

文章目录 引言资源网站实战操作说明 引言 1Panel 提供了一个应用提交开发环境&#xff0c;开发者可以通过提交应用的方式将自己的应用推送到 1Panel 的应用商店中&#xff0c;供其他用户使用。由此衍生了一种本地应用商店的概念&#xff0c;用户可以自行编写应用配置并上传到自…

Evidential Deep Learning和证据理论教材的区别(主要是概念)

最近终于彻底搞懂了Evidential Deep Learning&#xff0c;之前有很多看不是特别明白的地方&#xff0c;原来是和证据理论教材&#xff08;是的&#xff0c;不只是国内老师写的&#xff0c;和国外的老师写的教材出入也比较大&#xff09;的说法有很多不一样&#xff0c;所以特地…

text-decoration: underline;不生效

必须得纪念一下&#xff0c;在给文本加下划线时&#xff0c;发现在win电脑不生效&#xff0c;部分mac也不生效&#xff0c;只有个别的mac生效了&#xff0c;思考了以下几种方面&#xff1a; 1.兼容性问题&#xff1f; 因为是electron项目&#xff0c;不存在浏览器兼容性问题&…

VUE SSR(服务端渲染)

&#x1f916; 作者简介&#xff1a;水煮白菜王&#xff0c;一位前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧和知识归纳总结✍。 感谢支持&#x1f495;&#x1f495;&#…

ARCGIS国土超级工具集1.5更新说明

ARCGIS国土超级工具集V1.5版本更新说明&#xff1a;因作者近段时间工作比较忙及正在编写ARCGISPro国土超级工具集&#xff08;截图附后&#xff09;的原因&#xff0c;故本次更新为小更新&#xff08;没有增加新功能&#xff0c;只更新了已有的工具&#xff09;。本次更新主要修…

刘鑫炜履新共工新闻社新媒体研究院院长,赋能媒体融合新征程

2025年4月18日&#xff0c;大湾区经济网战略媒体共工新闻社正式对外宣布一项重要人事任命&#xff1a;聘任蚂蚁全媒体总编刘鑫炜为新媒体研究院第一任院长。这一举措&#xff0c;无疑是对刘鑫炜在新媒体领域卓越专业能力与突出行业贡献的又一次高度认可&#xff0c;也预示着共工…

java基础从入门到上手(九):Java - List、Set、Map

一、List集合 List 是一种用于存储有序元素的集合接口&#xff0c;它是 java.util 包中的一部分&#xff0c;并且继承自 Collection 接口。List 接口提供了多种方法&#xff0c;用于按索引操作元素&#xff0c;允许元素重复&#xff0c;并且保持插入顺序。常用的 List 实现类包…

UWP发展历程

通用Windows平台(UWP)发展历程 引言 通用Windows平台(Universal Windows Platform, UWP)是微软为实现"一次编写&#xff0c;处处运行"的愿景而打造的现代应用程序平台。作为微软统一Windows生态系统的核心战略组成部分&#xff0c;UWP代表了从传统Win32应用向现代应…

git忽略已跟踪的文件/指定文件

在项目开发中&#xff0c;有时候我们并不需要git跟踪所有文件&#xff0c;而是需要忽略掉某些指定的文件或文件夹&#xff0c;怎么操作呢&#xff1f;我们分两种情况讨论&#xff1a; 1. 要忽略的文件之前并未被git跟踪 这种情况常用的方法是在项目的根目录下创建和编辑.gitig…

AI 组件库是什么?如何影响UI的开发?

AI组件库是基于人工智能技术构建的、面向用户界面&#xff08;UI&#xff09;开发的预制模块集合。它们结合了传统UI组件&#xff08;如按钮、表单、图表&#xff09;与AI能力&#xff08;如机器学习、自然语言处理、计算机视觉&#xff09;&#xff0c;旨在简化开发流程并增强…

【Win】 cmd 执行curl命令时,输出 ‘命令管道位置 1 的 cmdlet Invoke-WebRequest 请为以下参数提供值: Uri: ’ ?

1.原因&#xff1a; 有一个名为 Invoke-WebRequest 的 CmdLet&#xff0c;其别名为 curl。因此&#xff0c;当您执行此命令时&#xff0c;它会尝试使用 Invoke-WebRequest&#xff0c;而不是使用 curl。 2.解决办法 在cmd中输入如下命令删除这个curl别名&#xff1a; Remov…

UE5 UE循环体里怎么写延迟

注&#xff1a;需要修改UE循环蓝图节点或者自己新建个蓝图宏库把UE循环节点的原来代码粘贴进去修改。 一、For Loop With Delay 二、For Each Loop With Delay 示例使用&#xff1a; 标注参考出处&#xff1a;分享UE5自制Loop with delay宏&#xff0c;在loop循环中添加执行…