守护进程编程
1. 守护进程的含义
守护进程的含义:
守护进程(Daemon)是指一种在后台运行的进程,通常不与用户交互,用于执行一些常驻任务,如系统监控、日志管理、定时任务等。它通常在操作系统启动时就被启动,并且会持续运行直到系统关闭。
守护进程的特点:
- 在后台运行,不依赖于终端。
- 通常没有控制终端。
- 独立于用户会话。
- 自动启动和停止。
2.编程实现守护进程的主要过程:
- 调用
fork()
: 创建一个子进程,然后父进程退出,确保子进程在后台运行。 - 调用
setsid()
: 创建一个新的会话,成为该会话的领导进程,这样守护进程就不再和父进程的终端关联,且无法再成为该会话的控制终端。 - 关闭文件描述符: 守护进程不需要与终端交互,因此需要关闭标准输入、标准输出和标准错误等文件描述符(0, 1, 2)。
- 改变工作目录: 守护进程最好改变工作目录,以确保不影响系统的其他部分,通常可以将工作目录改为
/
。 - 设置文件权限掩码: 设置文件权限掩码为 0,以确保守护进程创建的文件可以具有任何权限。
- 创建日志文件(可选): 通常守护进程会将输出重定向到日志文件。
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 main
或break function_name
- 启动程序:
run
- 单步执行:
step
或next
- 查看变量:
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
这时,外部用户就可以通过阿里云服务器访问树莓派系统。