当前位置: 首页 > news >正文

LINUX学习——守护进程的含义及编程实现

实验目的
  1. 理解守护进程的含义。
  2. 掌握编程实现守护进程的主要步骤。
实验步骤
  1. 守护进程的含义

    • 守护进程是运行在后台的一种特殊进程,独立于控制终端,周期性地执行任务或等待处理事件。
    • 守护进程通常以 d 结尾,如 httpdsshd 等。
  2. 编程实现守护进程的主要步骤

    • 创建子进程,父进程退出。
    • 调用 setsid() 创建新会话。
    • 改变工作目录为根目录 /
    • 重设文件权限掩码 umask
    • 关闭不需要的文件描述符。
    • 处理 SIGCHLD 信号,避免僵尸进程。
  3. 代码示例

  ```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。
    在这里插入图片描述

实验二:使用三种方法创建守护进程

实验目的
  1. 使用 nohup 命令、fork() 函数和 daemon() 函数创建守护进程。
实验步骤
  1. 使用 nohup 命令
    nohup ./your_program &
    

在这里插入图片描述

  1. 使用 fork() 函数

    • 参考实验一的代码,通过 fork()setsid() 创建守护进程。
      在这里插入图片描述
  2. 使用 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调试原理及应用

实验目的
  1. 掌握 GDB 调试原理。
  2. 使用 GDB 调试一个 C 程序。
实验步骤
  1. GDB 调试原理

    • GDB 通过 ptrace 系统调用控制被调试程序的执行。
    • 可以设置断点、查看变量、单步执行等。
  2. 调试 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
      

在这里插入图片描述

http://www.xdnf.cn/news/9109.html

相关文章:

  • Function Calling的机制 (含示例)
  • Sqlite3交叉编译全过程
  • 2025妈妈杯数学建模B题完整分析论文
  • 游戏引擎学习第233天
  • 【go】什么是Go语言中的GC,作用是什么?调优,sync.Pool优化,逃逸分析演示
  • 深度学习神经网络全连接笔记day1
  • 2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(四级)真题
  • python flask 项目部署
  • 源码分析之Leaflet中Point
  • CSS 美化页面(五)
  • TikTok流量变现全攻略:免费与付费玩法解析
  • 【项目管理】第19章 配置与变更管理-- 知识点整理
  • 嵌入式ARM RISCV toolchain工具 梳理arm-none-eabi-gcc
  • 第八篇:系统分析师第三遍——3、4章
  • index: 自动化浏览器智能体
  • 【 图像梯度处理,图像边缘检测】图像处理(OpenCv)-part6
  • HarmonyOS 基础语法概述 UI范式
  • 双击热备方案及不同方案的需求、方案对比
  • hive的基础配置优化与数仓流程
  • GitHub Copilot在产品/安全团队中的应用实践:处理Markdown、自动化报告与电子表格、使用CLI命令等
  • leetcode0145. 二叉树的后序遍历-easy
  • AutoSAR从概念到实践系列之MCAL篇(一)——MCAL架构及其模块详解
  • 手撕数据结构算法OJ——栈和队列
  • eNSP无法启动AR报错码40,而且按照eNSP帮助手册排查都没用,我的处理方法【自己存档版】
  • 2N60-ASEMI功业控制与自动化专用2N60
  • python中,处理多分类时,模型之间的参数设置
  • sort和swap函数
  • 数据结构之稀疏矩阵与三元组表示法
  • 23种设计模式全面解析
  • 告别Feign:基于Spring 6.1 RestClient构建高可靠声明式HTTP客户端