LINUX学习——守护进程的含义及编程实现
实验目的
- 理解守护进程的含义。
- 掌握编程实现守护进程的主要步骤。
实验步骤
-
守护进程的含义:
- 守护进程是运行在后台的一种特殊进程,独立于控制终端,周期性地执行任务或等待处理事件。
- 守护进程通常以
d
结尾,如httpd
、sshd
等。
-
编程实现守护进程的主要步骤:
- 创建子进程,父进程退出。
- 调用
setsid()
创建新会话。 - 改变工作目录为根目录
/
。 - 重设文件权限掩码
umask
。 - 关闭不需要的文件描述符。
- 处理
SIGCHLD
信号,避免僵尸进程。
-
代码示例:
```c#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h> // 添加这个头文件
#include <signal.h>int main() {pid_t pid;pid = fork();if (pid < 0) {perror("fork error");exit(1);}if (pid > 0) {exit(0); // 父进程退出}setsid(); // 创建新会话chdir("/"); // 改变工作目录umask(0); // 重设文件权限掩码// 关闭文件描述符for (int i = 0; i < 3; i++) {close(i);}// 忽略 SIGCHLD 信号signal(SIGCHLD, SIG_IGN);while (1) {printf("守护进程运行中...\n");sleep(5);}return 0;
}
```bash
bash
复制
gcc daemon.c -o daemon
运行程序:
bash
复制
./daemon
查看守护进程是否在运行:
bash
复制
ps -ef | grep 'daemon'
实验结果
- 编译并运行程序后,守护进程在后台持续运行,即使终端关闭也不会终止。
- 查看进程信息,确认其 PPID 为 1。
实验二:使用三种方法创建守护进程
实验目的
- 使用
nohup
命令、fork()
函数和daemon()
函数创建守护进程。
实验步骤
- 使用
nohup
命令:nohup ./your_program &
-
使用
fork()
函数:- 参考实验一的代码,通过
fork()
和setsid()
创建守护进程。
- 参考实验一的代码,通过
-
使用
daemon()
函数:#include <unistd.h> int main() {if (daemon(0, 0) == -1) {perror("daemon error");exit(1);}while (1) {printf("守护进程运行中...\n");sleep(5);}return 0; }
实验三:GDB调试原理及应用
实验目的
- 掌握 GDB 调试原理。
- 使用 GDB 调试一个 C 程序。
实验步骤
-
GDB 调试原理:
- GDB 通过
ptrace
系统调用控制被调试程序的执行。 - 可以设置断点、查看变量、单步执行等。
- GDB 通过
-
调试 C 程序:
- 编写一个简单的 C 程序:
#include <stdio.h> int main() {int a = 1, b = 2, c = a + b;printf("c = %d\n", c);return 0; }
- 编译时加入调试信息:
gcc -g test.c -o test
- 启动 GDB:
gdb ./test
- 设置断点并运行:
break 5 run
- 编写一个简单的 C 程序: