Linux c/c++进程之僵尸进程和守护进程

简介: 这篇文章介绍了Linux系统中僵尸进程和守护进程的概念、产生原因、解决方法以及如何创建守护进程。

1. 僵尸进程

1.1 僵尸进程的定义:

   父进程创建了子进程,而子进程先于父进程结束,子进程的资源没有被释放,就会变成僵尸进程,持续占用系统资源

1.2 僵尸进程的解决办法

   子进程在结束之前会向父进程发送SIGCHLD信号,父进程接收到信号之后,先回收子进程资源,然后父进程自己再结束

   想要防止僵尸进程的情况出现,可以在父进程中写一个wait函数(或者waitpid函数)等待子进程发送的SIGCHLD信号

无wait()函数的情况:

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(){
    if(fork()){
        printf("子进程被创建!\n");
    }else{
        for(int i = 0;i<5;i++){
            printf("子进程执行:%d\n",i+1);
            sleep(1);
        }
    }
    printf("父进程结束!\n\n");
    return 0;
}

运行结果:

 从上面的输出结果可以看出,在没有wait()函数的情况下,父进程并不会等待子进程结束之后再执行"父进程结束!"这句话,如果在此时父进程在子进程未结束前被强制结束,那么就会造成僵尸进程的情况出现

有wait()函数的情况:

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(){
    if(fork()){
        printf("子进程被创建!\n");
        wait(0);
    }else{
        for(int i = 0;i<5;i++){
            printf("子进程执行:%d\n",i+1);
            sleep(1);
        }
    }
    printf("父进程结束!\n\n");
    return 0;
}

运行结果:

   当存在wait()函数时,父进程会等待子进程发送的SIGCHLD信号,当父进程接收到信号之后,先回收子进程资源,父进程再结束

2.守护进程

2.1 守护进程概念

独立记录其它进程的情况,记录操作系统日志等

2.2 守护进程的查看方法

ps -axj

TPGID为 -1 的是守护进程

2.3 守护进程的创建

2.3.1 守护进程的功能实现和其它进程一样

2.3.2 将一个进程变为守护进程的步骤

  • 干掉其父进程
  • 摆脱终端控制(关闭0 1 2 文件描述符并重定向当前进程的io操作到 /dev/NULL (黑洞设备))
  • 摆脱原有会话,进程组的控制从而创建新的会话

2.4 创建守护进程编程模型

2.4.1 创建守护进程方式一

  1. 创建新会话 setsid()函数
  2. 改变当前工作目录 chdir()函数
  3. 重设当前文件权限 umask()函数
  4. 关闭文件 close()函数

    2.4.2 创建守护进程方式二

  5. 重设文件权限 umask()函数

  6. 创建子进程 fork()函数
  7. 结束父进程
  8. 创建新会话 setsid()
  9. 防止子进程成为僵尸进程 signal()函数忽略掉SIGCHLD SIGHUP信号
  10. 改变当前工作目录 chdir()函数
  11. 重定向文件描述符号 open()函数 dup2()函数
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <sys/stat.h>
#include <sys/types.h>

int main(){
    // 1. 重设文件权限
    umask(0);
    // 2. 创建子进程
    int ret = fork();
    if(ret < 0) printf("创建进程失败:%m"),exit(-1);
    if(ret > 0) printf("父进程结束:%m\n"),exit(0);     // 3. 让父进程结束
    if(0 == ret){
        printf("pid:%d\n",getpid());
        // 4. 创建新会话
        setsid();
        // 5. 防止子进程成为僵尸进程   忽略掉SIGCHLD SIGHUP信号
        signal(SIGCHLD,SIG_IGN);
        signal(SIGHUP,SIG_IGN);
        // 6. 改变当前工作目录
        chdir("/");
        // 7. 重定向文件描述符号
        int fd = open("/dev/NULL",O_RDWR);
        dup2(fd,0);
        dup2(fd,1);
    }

    while(1){
        //做事情(模拟守护进程工作)
        sleep(1);
    }

    return 0;
}

结果:

关闭守护进程:

由此可知上方创建的pid为3469的守护进程已经被关闭

2.5 进程的组织形式

多个进程组成一个进程组

多个进程组组成一个会话

注: 进程组的组长 session进程

2.6 守护进程的关闭

直接使用kill 2 pid 将指定进程干掉即可

2.7 终端标准输入输出设备

  • 0 标准输入设备
  • 1 标准输出设备
  • 2 标准错误输出设备
相关文章
|
8天前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
1月前
|
缓存 监控 Linux
linux进程管理万字详解!!!
本文档介绍了Linux系统中进程管理、系统负载监控、内存监控和磁盘监控的基本概念和常用命令。主要内容包括: 1. **进程管理**: - **进程介绍**:程序与进程的关系、进程的生命周期、查看进程号和父进程号的方法。 - **进程监控命令**:`ps`、`pstree`、`pidof`、`top`、`htop`、`lsof`等命令的使用方法和案例。 - **进程管理命令**:控制信号、`kill`、`pkill`、`killall`、前台和后台运行、`screen`、`nohup`等命令的使用方法和案例。
116 4
linux进程管理万字详解!!!
|
24天前
|
存储 运维 监控
深入Linux基础:文件系统与进程管理详解
深入Linux基础:文件系统与进程管理详解
62 8
|
21天前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
|
1月前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
69 4
|
1月前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
1月前
|
消息中间件 存储 Linux
|
2月前
|
运维 Linux
Linux查找占用的端口,并杀死进程的简单方法
通过上述步骤和命令,您能够迅速识别并根据实际情况管理Linux系统中占用特定端口的进程。为了获得更全面的服务器管理技巧和解决方案,提供了丰富的资源和专业服务,是您提升运维技能的理想选择。
58 1
|
2月前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
384 3
|
2月前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
【10月更文挑战第9天】本文将深入浅出地介绍Linux系统中的进程管理机制,包括进程的概念、状态、调度以及如何在Linux环境下进行进程控制。我们将通过直观的语言和生动的比喻,让读者轻松掌握这一核心概念。文章不仅适合初学者构建基础,也能帮助有经验的用户加深对进程管理的理解。
32 1