守护进程(Daemon Process) 是一种在后台运行的进程,通常没有终端控制。它们通常在系统启动时启动,并在系统关闭时停止。
守护进程的特征:
1.它没有控制终端(即不与用户的终端交互)。
2.它通常运行在后台,独立于用户会话。
3.它在系统启动时启动,并且在系统关闭时停止。
4.它通常会重定向输入/输出,避免与终端相关的交互。
编程实现守护进程的主要步骤:
1.创建子进程
使用 fork() 创建一个子进程。父进程退出,确保守护进程独立运行。
2.创建新的会话
调用 setsid() 来使子进程成为会话的领导者,并且脱离控制终端。
3.改变工作目录
通常守护进程会将当前工作目录更改为根目录,以避免占用挂载点。
4.文件权限
由于守护进程不与终端相关联,它通常会关闭标准输入、输出、错误流并重定向到一个文件,避免和终端交互。
5.处理信号
守护进程通常会忽略某些信号,或者为某些信号设置处理程序。
6.运行主任务
完成以上步骤后,守护进程会进入主循环,执行其主要任务。
在阿里云服务器、树莓派上实践
1.nohup
#阿里云服务器
nohup ping 8.8.8.8 > /dev/null 2>&1 &#树莓派
nohup python3 my_script.py > /dev/null 2>&1 &

2.fork
编写一个c文件,编译运行(两者操作相同)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>int main() {pid_t pid = fork();if (pid < 0) {exit(EXIT_FAILURE);}if (pid > 0) {exit(EXIT_SUCCESS);}umask(0);setsid();// 关闭标准文件描述符close(STDIN_FILENO);close(STDOUT_FILENO);close(STDERR_FILENO);// 守护进程主循环while (1) {// 你的守护进程代码sleep(10);}return EXIT_SUCCESS;
}
gcc daemon_fork.c -o daemon_fork
./daemon_fork

3.daemon
和上面的操作一样
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main() {// daemon(nochdir, noclose)if (daemon(1, 1) < 0) {perror("daemon");exit(EXIT_FAILURE);}// 守护进程主循环while (1) {// 你的守护进程代码sleep(10);}return EXIT_SUCCESS;
}
gcc daemon_func.c -o daemon_func
./daemon_func

GDB调试
创建一个c文件
#include <stdio.h>int sum(int a, int b) {return a + b;
}int main() {int x = 5;int y = 10;int result = sum(x, y);printf("Result: %d\n", result);return 0;
}
编译运行
gcc -g testgdb.c -o testgdb
启动GDB
gdb ./testgdb

树莓派实现外网访问
借助阿里云服务器,使用SSH反向代理,完成树莓派的外网访问。
首先,配置阿里云服务器的ssh文件

进入树莓派终端输入
ssh -p 22 -qngfNTR port:localhost:22 user_pi@aliyun_ip
完成后再阿里云服务器输入ss -ntl查看是否有对应的连接,在另外一台电脑终端输入
ssh -p [你绑定的端口号] [树莓派用户]@云服务器地址

总结
每天都学习一点。
