守护进程编程

守护进程编程

1. 守护进程的含义

守护进程的含义:

守护进程(Daemon)是指一种在后台运行的进程,通常不与用户交互,用于执行一些常驻任务,如系统监控、日志管理、定时任务等。它通常在操作系统启动时就被启动,并且会持续运行直到系统关闭。

守护进程的特点:

  • 在后台运行,不依赖于终端。
  • 通常没有控制终端。
  • 独立于用户会话。
  • 自动启动和停止。

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

  1. 调用 fork(): 创建一个子进程,然后父进程退出,确保子进程在后台运行。
  2. 调用 setsid(): 创建一个新的会话,成为该会话的领导进程,这样守护进程就不再和父进程的终端关联,且无法再成为该会话的控制终端。
  3. 关闭文件描述符: 守护进程不需要与终端交互,因此需要关闭标准输入、标准输出和标准错误等文件描述符(0, 1, 2)。
  4. 改变工作目录: 守护进程最好改变工作目录,以确保不影响系统的其他部分,通常可以将工作目录改为 /
  5. 设置文件权限掩码: 设置文件权限掩码为 0,以确保守护进程创建的文件可以具有任何权限。
  6. 创建日志文件(可选): 通常守护进程会将输出重定向到日志文件。

3. 创建守护进程的方法

方法1: 使用 nohup 命令

nohup 命令可以使得程序在退出终端后继续运行,这样即使用户退出会话,程序依然能够持续运行。

nohup ./your_program &
  • 该命令将 your_program 程序作为守护进程运行,并将其输出重定向到 nohup.out 文件。
方法2: 使用 fork() 函数

在 C 程序中使用 fork() 创建守护进程,过程如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>

int main() {
    pid_t pid = fork();  // 创建子进程
    if (pid < 0) {
        perror("Fork failed");
        exit(1);
    }

    if (pid > 0) {
        exit(0);  // 父进程退出
    }

    // 创建新的会话
    if (setsid() < 0) {
        perror("Failed to create session");
        exit(1);
    }

    // 改变工作目录
    chdir("/");

    // 关闭文件描述符
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

    while (1) {
        // 守护进程的任务
        sleep(30);
    }

    return 0;
}

编译并执行该程序后,它会成为一个守护进程。

方法3: 使用 daemon() 函数

daemon() 函数是一个标准的库函数,直接用于创建守护进程。

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

int main() {
    if (daemon(0, 0) == -1) {
        perror("Daemon failed");
        exit(1);
    }

    while (1) {
        // 守护进程的任务
        sleep(30);
    }

    return 0;
}

daemon() 函数会自动创建一个新的会话,重定向输入输出,关闭文件描述符,并在后台运行。

4. 使用 GDB 调试 C 程序

在阿里云服务器或树莓派上使用 GDB 调试 C 程序的过程:

编译带调试信息的程序

首先,需要使用 -g 选项编译程序,这样 GDB 能够读取调试信息。

gcc -g your_program.c -o your_program
启动 GDB 调试

使用 GDB 调试程序:

gdb ./your_program

进入 GDB 调试后,可以设置断点、运行程序、查看变量值等:

  • 设置断点:break mainbreak function_name
  • 启动程序:run
  • 单步执行:stepnext
  • 查看变量:print variable_name
  • 查看调用栈:backtrace
  • 退出 GDB:quit
示例:
(gdb) break main
(gdb) run
(gdb) step
(gdb) print variable_name

5. 使用 SSH 反向代理实现树莓派外网访问

在树莓派上创建 SSH 连接

首先,确保树莓派和阿里云服务器能够通过 SSH 连接。在树莓派上运行:

ssh user@aliyun_server_ip
配置反向 SSH 代理

在树莓派上使用 SSH 反向代理命令将本地的端口映射到阿里云服务器:

ssh -R 2222:localhost:22 user@aliyun_server_ip

这里 -R 2222:localhost:22 表示将阿里云服务器的 2222 端口转发到树莓派的 22 端口(SSH 端口)。

在阿里云服务器上配置 SSH

确保阿里云服务器的 SSH 服务允许反向代理,编辑 /etc/ssh/sshd_config 文件,确保有如下配置:

GatewayPorts yes

重启 SSH 服务:

sudo systemctl restart ssh
从外部访问树莓派

其他人可以通过访问阿里云服务器的 2222 端口来登录树莓派:

ssh -p 2222 pi@aliyun_server_ip

这时,外部用户就可以通过阿里云服务器访问树莓派系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值