分裂守护进程

由于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. interrupt 1 using 1

    释疑:void Timer0() interrupt 1 using 1 Timer0   是函数名,随便取的 interrupt   xx   using   y 跟在interrupt   后面的 ...

  2. sql server 2005 修改动态端口,连接字符串为:需要改成:IP地址+逗号+端口号才行

    1.sql server 2005 安装完毕后,默认是动态段,需要用sql brower 查询端口号:修改给固定端口后,格式为:IP地址+逗号+端口号. 2.sql 2000 的格式为:格式为:IP地 ...

  3. 查看DNS服务器

    电脑右键查看本地连接 查看状态 然后看DNS

  4. django -- 自定义simpletag 和 filter

    django中自定义simpletag,即使用自己定义的函数在html中处理数据. 步骤: 1.创建并注册app settings.py INSTALLED_APPS = [ 'django.cont ...

  5. Android真机调试手动添加程序包的LogCat

    android真机调试有时候看LogCat 时,有时候那个跑的本程序的LogCat 没有出现而是 出现的是" All messages (no filters) " .此时 的Lo ...

  6. git回滚到某个commit 上和 返回最新的版本git

    1. 代码回退 首先你要用git log 查看你要回到的那个本版, 然后用 git reset --hard HEAD^ 回退到上个版本 git reset --hard commit_id 退到/进 ...

  7. 《Android Studio实用指南》4.27 使用演示模式

    本文节选自<Android Studio实用指南> 第4章第27节 作者: 毕小朋 目前本书已上传到百度阅读, 在百度中搜索[Anroid Studio实用指南]便可以找到本书. 什么是演 ...

  8. c++ 迭代器模式(iterator)

    提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示.当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍 历的时候,就应该考虑用迭代器模式.同时需要对聚集有多种方式遍历时,可以 ...

  9. 用C语言进行最基本的socket编程

    什么是socket 你经常听到人们谈论着 “socket”,或许你还不知道它的确切含义.现在让我告诉你:它是使用 标准Unix 文件描述符 (file descriptor) 和其它程序通讯的方式.什 ...

  10. spring4-4-jdbc-01

    1.建立数据属性文件db.properties jdbc.user=root jdbc.password=root jdbc.driverClass=com.mysql.jdbc.Driver jdb ...