分裂守护进程

由于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

处理僵尸进程

  1. 通过信号机制
    子进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。在信号处理函数中调用wait进行处理僵尸进程。
  2. fork两次
    《Unix 环境高级编程》8.6节说的非常详细。原理是将子进程成为孤儿进程,从而其的父进程变为init进程,通过init进程可以处理僵尸进程。
使用信号机制处理僵尸进程

在源文件中使用

signal(SIGCLD, SIG_IGN);

通知内核本进程不关心子进程的结束,子进程将被init释放

13206 ?        Ss     0:00 ./test3-2

Linux Guard Service - 守护进程分裂的更多相关文章

  1. Linux Guard Service - 守护进程的作用、用途、父进程标识的特点

    让test2直接成为守护进程 [root@localhost 02]# cat test2.c //test2 #include<stdio.h> #include<unistd.h ...

  2. Linux Guard Service - 守护进程再次分裂子进程

    当系统区内存不能再申请新进程的时候申请会失败 在512MB内存下最多分配的子进程数 3331 [root@localhost 05]# ./test5-1 50000 expect 50000 sub ...

  3. Linux Guard Service - 进程分裂与脱离

    进程分裂更名 void set_ps_name(char *name) { prctl(PR_SET_NAME, name); } 修改进程长名称 备份进程环境变量空间 for (i = 1; i & ...

  4. Linux Guard Service - 杀死守护进程

    杀死某个子进程 杀死守护进程的子进程后,改进程会变为僵尸进程 14087 ? Ss 0:00 ./test4-1 14088 ? S 0:00 \_ ./test4-1 14089 ? S 0:00 ...

  5. 【Linux】- Ubuntu守护进程supervisor

    linux的守护进程类似于windows的服务.linux通过supervisor创建守护进程. 1.安装supervisor sudo apt-get install supervisor 安装成功 ...

  6. Linux架构--------Rsync守护进程推和拉

    一.Rsync基本概述 rsync是一款开源.快速.多功能.可实现全量及增量的本地或远程数据同步备份的优秀工具.rsync软件适用于Unix/linux/Windows等多种操作系统平台. 二.Rsy ...

  7. Linux 中的 守护进程

    什么是守护进程 脱离控制终端的,运行于后端的进程,由系统管理的,按计划自动启动/停止/重启,用以执行特定的任务. 为什么要有守护进程? 在某些需求场景下,我们希望某项系统任务能够按计划按预期,始终/自 ...

  8. linux下的守护进程daemon

    什么是守护进程?其实感觉守护进程并没有什么明确的定义,只是守护进程有一些特征,这是它需要遵循的. 守护进程的第一个特征是长时间在后台运行的程序,并且主要是为了提供某种服务,而为了能够让服务尽可能随时都 ...

  9. linux shell脚本守护进程监控svn服务

    最近搭建的svn服务不知道什么原因服务总是被关闭(如果你不知道怎么搭建svn可以参考linux下搭建svn版本控制软件),因此用shell脚本实现一个守护进程.用于监控svn服务是否启动,如果服务不在 ...

随机推荐

  1. question?

  2. Python实践练习:电话号码和 E-mail 地址提取程序

    题目: 假设你有一个无聊的任务,要在一篇长的网页或文章中,找出所有电话号码和邮件地址.如果手动翻页,可能需要查找很长时间.如果有一个程序,可以在剪贴板的文本中查找电话号码和 E-mail 地址,那你就 ...

  3. asp.net(c#)GridView实现鼠标悬停高亮显示

    搜索了一下,发现对于这种基本都使用girdview中的RowDataBound事件完成,下面看看网上提供的简单方法protected void GridView1_RowDataBound(objec ...

  4. 「小程序JAVA实战」小程序模块页面引用(18)

    转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-18/ 上一节,讲了模板的概念,其实小程序还提供了模块的概念.源码:https://github.c ...

  5. jquery 三元运算

    三元运算: 条件  ? 条件为真取此值 : 条件为假取此值; var v = $(:check).prop('checked')?faule:true; $(:check).prop('checked ...

  6. iOS学习之UIDatePicker控件使用

    iOS上的选择时间日期的控件是这样的,左边是时间和日期混合,右边是单纯的日期模式. ,   您可以选择自己需要的模式,Time, Date,Date and Time  , Count Down Ti ...

  7. Java CST格式字符串转换成Date类型的数据

    Date date = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US).parse("We ...

  8. svn配置多仓库与权限控制

    telnet: connect to address 47.106.115.228: Connection refused svn执行上下文错误由于目标计算机积极拒绝无法连接 标签: svn 2017 ...

  9. 494. Target Sum 添加标点符号求和

    [抄题]: You are given a list of non-negative integers, a1, a2, ..., an, and a target, S. Now you have ...

  10. 关于super关键字

    1.在Java中,有时会遇到子类中的成员变量或方法与父类中的成员变量或方法同名.此时父类的成员变量或方法就会被隐藏(可以理解为重写),如果还想要使用父类中的这个成员变量或方法,就需要用到super. ...