守护者进程含义
定义:守护进程(Daemon)是运行在后台的特殊进程,独立于控制终端,周期性执行任务或等待事件触发。它通常以 root 权限运行,名称常以 d 结尾(如 sshd, crond)。
特性:
后台运行:脱离终端,关闭终端不影响其运行。
无交互性:不依赖用户输入,输出通常通过日志记录。
长期存活:系统启动时开始运行,随系统关闭停止。
父进程为 init:原父进程退出后,由 init 进程接管。
在Ubuntu上创建一个守护者进程
nohup命令方式
#!/bin/bash
while true; do
echo "守护进程运行中..." >> /tmp/nohup.log
sleep 5
done
fork函数
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <syslog.h>
#include <sys/stat.h>
int main() {
pid_t pid;
// 第一次 fork,父进程退出
pid = fork();
if (pid < 0) exit(1);
if (pid > 0) exit(0); // 父进程退出
// 创建新会话
if (setsid() == -1) {
exit(1); // 处理 setsid 失败
}
// 第二次 fork,避免成为会话组长
pid = fork();
if (pid < 0) exit(1);
if (pid > 0) exit(0);
// 初始化 syslog(关键步骤!)
openlog("fork_test", LOG_PID | LOG_PERROR, LOG_DAEMON);
// 改变目录
if (chdir("/") == -1) {
syslog(LOG_ERR, "chdir failed");
exit(1);
}
umask(0);
// 关闭文件描述符
for (int i = 0; i < 3; i++) close(i);
// 主逻辑
while (1) {
syslog(LOG_INFO, "守护进程运行中..."); // 使用 LOG_INFO
sleep(5);
}
return 0;
}
daemon函数
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <syslog.h>
#include <errno.h>
int main() {
// 使用 daemon(0, 0) 自动完成守护进程创建
if (daemon(0, 0) == -1) {
perror("daemon");
exit(1);
}
while (1) {
syslog(LOG_INFO, "守护进程运行中...");
sleep(5);
}
return 0;
}
GDB调试
GDB调试原理:
核心机制:通过 ptrace 系统调用控制目标进程,实现暂停、单步执行、查看内存等。
关键功能:
断点设置:在代码中插入 int 3 指令,触发中断暂停。
内存访问:读写目标进程的内存,查看变量值。
反向调试:记录执行历史,支持回溯。
测试程序
#include <stdio.h>
#include <unistd.h>
int main() {
int a = 10;
int b = 20;
int c = a + b;
printf("a + b = %d\n", c);
sleep(5);
return 0;
}
调试命令实例
(gdb) break main # 在 main 函数设置断点
(gdb) run # 运行程序
(gdb) print a # 查看变量 a 的值
(gdb) step # 单步执行
(gdb) bt # 查看调用栈
(gdb) quit # 退出 GDB