Linux Guard Service - 守护进程分裂
分裂守护进程
由于fork()后第一行仍然在循环中,使用fork()返回值鉴别当前进程的性质
int i = 0;
for (i = 0; i < 10; i++) {
// sleep(1);
printf("new fork() process pid = %d \n", pid);
pid = fork();
if (pid == 0) break;
}
pid==0时说明该进程为子进程不能再进行循环(否则将不断创造进程直到子进程上限)
子进程和父进程的关系
1. 子进程的fork()返回值为0
2. 子进程的pid序号紧接着父进程的序号
创建10个子进程
[root@localhost 03]# new fork() process pid = 11250
new fork() process pid = 11251
new fork() process pid = 11252
new fork() process pid = 11253
new fork() process pid = 11254
new fork() process pid = 11255
new fork() process pid = 11256
new fork() process pid = 11257
new fork() process pid = 11258
new fork() process pid = 11259
[root@localhost 03]#
[root@localhost 03]#
观察系统守护进程树
11250 ? Ss 0:00 ./test3-1
11251 ? S 0:00 \_ ./test3-1
11252 ? S 0:00 \_ ./test3-1
11253 ? S 0:00 \_ ./test3-1
11254 ? S 0:00 \_ ./test3-1
11255 ? S 0:00 \_ ./test3-1
11256 ? S 0:00 \_ ./test3-1
11257 ? S 0:00 \_ ./test3-1
11258 ? S 0:00 \_ ./test3-1
11259 ? S 0:00 \_ ./test3-1
11260 ? S 0:00 \_ ./test3-1
[root@localhost 03]#
fork()返回值的关系
在子进程中,fork返回值为0
在父进程中,fork返回值为子进程的pid
子进程直接复制父进程的PCB然后在fork紧接着的下一行开始执行(以防止fork中套fork的死循环情况)
僵尸进程
任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。
12711 ? Ss 0:00 ./test3-1
12712 ? Z 0:00 \_ [test3-1] <defunct>
12713 ? Z 0:00 \_ [test3-1] <defunct>
12722 ? Z 0:00 \_ [test3-1] <defunct>
12723 ? Z 0:00 \_ [test3-1] <defunct>
12724 ? Z 0:00 \_ [test3-1] <defunct>
12725 ? Z 0:00 \_ [test3-1] <defunct>
12726 ? Z 0:00 \_ [test3-1] <defunct>
12727 ? Z 0:00 \_ [test3-1] <defunct>
12729 ? Z 0:00 \_ [test3-1] <defunct>
12730 ? Z 0:00 \_ [test3-1] <defunct>
僵尸进程在ps -xf中的表示
杀死僵尸进程
使用pkill加进程名称,杀死全部进程
pkill test3-1
处理僵尸进程
- 通过信号机制
子进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。在信号处理函数中调用wait进行处理僵尸进程。 - fork两次
《Unix 环境高级编程》8.6节说的非常详细。原理是将子进程成为孤儿进程,从而其的父进程变为init进程,通过init进程可以处理僵尸进程。
使用信号机制处理僵尸进程
在源文件中使用
signal(SIGCLD, SIG_IGN);
通知内核本进程不关心子进程的结束,子进程将被init释放
13206 ? Ss 0:00 ./test3-2
Linux Guard Service - 守护进程分裂的更多相关文章
- Linux Guard Service - 守护进程的作用、用途、父进程标识的特点
让test2直接成为守护进程 [root@localhost 02]# cat test2.c //test2 #include<stdio.h> #include<unistd.h ...
- Linux Guard Service - 守护进程再次分裂子进程
当系统区内存不能再申请新进程的时候申请会失败 在512MB内存下最多分配的子进程数 3331 [root@localhost 05]# ./test5-1 50000 expect 50000 sub ...
- Linux Guard Service - 进程分裂与脱离
进程分裂更名 void set_ps_name(char *name) { prctl(PR_SET_NAME, name); } 修改进程长名称 备份进程环境变量空间 for (i = 1; i & ...
- Linux Guard Service - 杀死守护进程
杀死某个子进程 杀死守护进程的子进程后,改进程会变为僵尸进程 14087 ? Ss 0:00 ./test4-1 14088 ? S 0:00 \_ ./test4-1 14089 ? S 0:00 ...
- 【Linux】- Ubuntu守护进程supervisor
linux的守护进程类似于windows的服务.linux通过supervisor创建守护进程. 1.安装supervisor sudo apt-get install supervisor 安装成功 ...
- Linux架构--------Rsync守护进程推和拉
一.Rsync基本概述 rsync是一款开源.快速.多功能.可实现全量及增量的本地或远程数据同步备份的优秀工具.rsync软件适用于Unix/linux/Windows等多种操作系统平台. 二.Rsy ...
- Linux 中的 守护进程
什么是守护进程 脱离控制终端的,运行于后端的进程,由系统管理的,按计划自动启动/停止/重启,用以执行特定的任务. 为什么要有守护进程? 在某些需求场景下,我们希望某项系统任务能够按计划按预期,始终/自 ...
- linux下的守护进程daemon
什么是守护进程?其实感觉守护进程并没有什么明确的定义,只是守护进程有一些特征,这是它需要遵循的. 守护进程的第一个特征是长时间在后台运行的程序,并且主要是为了提供某种服务,而为了能够让服务尽可能随时都 ...
- linux shell脚本守护进程监控svn服务
最近搭建的svn服务不知道什么原因服务总是被关闭(如果你不知道怎么搭建svn可以参考linux下搭建svn版本控制软件),因此用shell脚本实现一个守护进程.用于监控svn服务是否启动,如果服务不在 ...
随机推荐
- java byte to hex
String str; byte[] bs = null; bs =str.getBytes(); bs =str.getBytes("utf-8") java byte to ...
- 学习python必备的学习网站
Django框架学习必备网站: 官方网站 https://www.djangoproject.com/ 1.11版英文文档 https://docs.djangoproject.com/en/ ...
- NPC问题及其解决方法(回溯法、动态规划、贪心法、深度优先遍历)
NP问题(Non-deterministic Polynomial ):多项式复杂程度的非确定性问题,这些问题无法根据公式直接地计算出来.比如,找大质数的问题(有没有一个公式,你一套公式,就可以一步步 ...
- JLRoute 使用
http://zhoulingyu.com/2016/01/03/iOS%E2%80%94%E2%80%94Scheme%E6%98%AF%E4%BB%80%E4%B9%88%E3%80%81%E6% ...
- SpringCloud04 服务配置中心、消息总线、远程配置动态刷新
1 环境说明 JDK:1.8 MAVENT:3.5 SpringBoot:2.0.5.RELEASE SpringCloud:Finchley.SR1 2 创建服务注册中心(Eureka服务端) 说明 ...
- 一些好用的 Oracle 批处理和语句
# 备份脚本 backup.bat @ECHO OFF COLOR 0A SET DaysAgo=1 SET Today=%date:~0,4%%date:~5,2%%date:~8,2% EXP u ...
- Mysql配置文件详解 my.cof
Mysql配置文件详解 # For advice on how to change settings please see # http://dev.mysql.com/doc/refman/5.6/ ...
- C++ 模板 与 泛型编程
C++ 模板 与 泛型编程 前言 模板有两种:类模板和函数模板 .模板是泛型编程的基础. 什么叫:泛型编程? 使用独立于特定类型的方式进行编程.也就是我们在编程的时候不明确的写上类型,而是使用一个模板 ...
- Java TreeMap的排序
TreeMap 和 HashMap 用法大致相同,但实际需求中,我们需要把一些数据进行排序:以前在项目中,从数据库查询出来的数据放在List中,顺序都还是对的,但放在HashMap中,顺序就完全乱了. ...
- code4511 信息传递
寻找最小环 #include <cstdio> #include <cstring> #include <iostream> using namespace std ...