目录

一、守护进程

1、含义及特点

2、创建守护进程的三种方式

(1)nohup命令创建

 (2)fork函数创建

 (3)使用 daemon函数创建

二、gdb调试原理

三、ssh反向代理


一、守护进程

1、含义及特点

守护进程(Daemon Process)是在后台运行的特殊进程,它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程通常在系统启动时运行,在系统关闭时终止。

守护进程特点:

  1. 长期运行(通常是系统整个运行期间)

  2. 在后台运行,不与任何控制终端关联

  3. 通常以root权限或其他特殊权限运行

  4. 不受用户登录/注销影响

  5. 通常用来处理系统级任务或服务

2、创建守护进程的三种方式

(1)nohup命令创建

创建一个tezst.sh的脚本

#!/bin/bash
while true; do
    echo "Daemon is running at $(date)" >> /tmp/daemon.log
    sleep 5
done

赋予脚本可执行权限

chmod +x test.sh

 使用 nohup 启动守护进程

nohup ./test.sh &

 检查进程是否运行

ps aux | grep test.sh

 (2)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;
    
    // 1. 创建子进程,父进程退出
    pid = fork();
    if (pid < 0) {
        perror("fork failed");
        exit(1);
    }
    if (pid > 0) { // 父进程
        exit(0);
    }
    
    // 2. 创建新会话
    if (setsid() < 0) {
        perror("setsid failed");
        exit(1);
    }
    
    // 3. 改变工作目录
    chdir("/");
    
    // 4. 重设文件权限掩码
    umask(0);
    
    // 5. 关闭文件描述符
    for (int i = 0; i < getdtablesize(); i++) {
        close(i);
    }
    
    // 6. 重定向标准输入/输出/错误
    open("/dev/null", O_RDONLY);
    open("/dev/null", O_RDWR);
    open("/dev/null", O_RDWR);
}

int main() {
    daemonize();
    
    // 守护进程的实际工作
    while (1) {
        // 在这里执行你的守护进程任务
        sleep(10);
    }
    
    return 0;
}

使用gcc编译并运行

gcc fork.c -o fork
./fork

 检查程序是否运行

prep -l "fork"

 (3)使用 daemon函数创建

创建daemon_func.c函数

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    // daemon(nochdir, noclose)
    // nochdir=0: 改变工作目录到 /
    // noclose=0: 重定向标准输入/输出/错误到 /dev/null
    if (daemon(0, 0) == -1) {  //
        perror("daemon failed");
        exit(1);
    }
    
    // 守护进程的实际工作
    while (1) {
        printf("Daemon is running...\n");  // 由于 noclose=0,这句不会输出到终端
        sleep(10);
    }
    
    return 0;
}

 gcc编译并运行

gcc daemon_func.c -o daemon_func
./daemon_func

 查看运行状态

prep -l "daemon_func"

二、gdb调试原理

GDB (GNU Debugger) 是一个强大的命令行调试工具,其核心原理包括:

进程控制:可以启动、暂停、继续和终止被调试程序。

断点管理:在指定位置(行号/函数/地址)设置断点。

单步执行:逐行或逐指令执行代码。

变量检查:查看和修改变量/内存/寄存器的值。

堆栈跟踪:显示函数调用链(backtrace)。

符号表解析:通过编译时生成的调试信息(-g 选项)关联源代码和机器指令。

安装 GDB

# Ubuntu/Debian
sudo apt-get update && sudo apt-get install gdb

# CentOS/RHEL
sudo yum install gdb

编译 C 程序时加入调试信息

g1.c

#include <stdio.h>

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

int main() {
    int x = 5, y = 10;
    int result = sum(x, y);
    printf("Result: %d\n", result);
    return 0;
}

 编译时添加 -g 选项

gcc -g g1.c -o g1

 启动 GDB 调试

gdb ./g1

 

进入gdb交互界面之后,可以进行断点测试

(gdb) b main      # 在 main 函数开头断点
(gdb) b 7         # 在第 7 行(int result = sum(x, y);)断点

运行程序 

(gdb) run

输出x的值

print x

三、ssh反向代理

1.ssh -p 22 -qngfNTR [你的端口号]:localhost:22 阿里云用户名@阿里云服务器IP           

ssh -p 22 -qngfNTR 9621:localhost:22 wanghy@114.55.126.125

查看监听端口ss -ntl,出现以下界面表示树莓派和阿里云已经连上。       

2.ssh -p [你绑定的端口号] [树莓派用户]@云服务器地址

ssh -p 9621 pi@114.55.126.125

以上操作是基于已经完成打开阿里云服务器端口且配置好相应ssh服务的步骤上完成的,如果没有完成相应操作,需要查询一下如何打开端口,配置ssh服务后再进行。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐