#Linux系统编程(孤儿进程及僵尸进程以及wait函数)

(一)发行版:Ubuntu16.04.7


(二)记录:

(1)概述

在 Unix/Linux 系统中,正常情况下,子进程是通过父进程创建的,且两者的运行是相互独立的,父进程永远无法预测子进程到底什么时候结束。当一个进程调用 exit 命令结束自己的生命时,其实它并没有真正的被销毁,内核只是释放了该进程的所有资源,包括打开的文件、占用的内存等,但是留下一个称为僵尸进程的数据结构,这个结构保留了一定的信息(包括进程号 the process ID,退出状态,运行时间),这些信息直到父进程通过 wait()/waitpid() 来取时才释放。这样设计的目的主要是保证只要父进程想知道子进程结束时的状态信息,就可以得到

(2)孤儿进程

一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将被 init 进程(进程号为1)所收养,并由 init 进程对它们完成状态收集工作。

(3)僵尸进程

一个进程使用 fork 创建子进程,如果子进程退出,而父进程并没有调用 wait 或 waitpid 获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵尸进程。

(4)孤儿进程创建运行

cpp 复制代码
 //子进程
	if(pid==0)
	 {
      sleep(2);
	  printf("This is a child process,parent_pid: %d\n",getppid());
	 }

计算机执行速度很快,子进程延时两秒,父进程早已经执行完毕退出进程,此时子进程被init进程收养,父进程变为init进程。

打印出收养子进程的父进程pid号为2769,所以pid为2769的进程即为init进程,使用以下命令查找父进程

cpp 复制代码
ps -aux | grep 2769

(5)僵尸进程运行

cs 复制代码
	//父进程
	if(pid>0)
	{
	//僵尸进程
	  while (1);
	}
	//子进程
	if(pid==0)
	{
	//僵尸进程
      printf("this is a child");
	  exit(0);
	 }

Zombie僵尸首字母Z,意味这pid号为2860的进程为僵尸进程,同时左边控制台无法弹出对话命令。使用kill杀死这个进程。

同时杀死创建的进程以及运行的a.out使左边控制台退出卡死状态

(6)wait函数(立即阻塞父进程去回收子进程)

作用:父进程用于回收子进程,减少僵尸进程

头文件:<sys/wait.h>

函数原型: pid_t wait(int *status)

返回值:成功则返回回收的子进程的pid,失败返回-1

与wait函数的参数有关的两个宏定义:

WIFEXITED(status):如果子进程正常退出,则该宏定义为真。

WEXITSTATUS(status):如果子进程正常退出,则该宏定义的值为子进程的退出值。

(7)wait函数编译运行

cs 复制代码
	//父进程
	if(pid>0)
	{
	//wait函数
	int status;
	wait(&status);
	if(WIFEXITED(status)==1){
    	printf("return value is %d\n",WEXITSTATUS(status));
	}

	}
	//子进程
	if(pid==0)
	  {
	//wait函数
	  sleep(2);
	  printf("this is a child\n");
	  exit(6);
	 }

运行时等待两秒后打印(sleep(2))


(三)命令:

相关推荐
AOwhisky1 小时前
Linux(CentOS)系统管理入门笔记(第二十一期)——防火墙管理(Firewalld)——zone、服务端口、富规则与端口转发
linux·运维·笔记·安全·centos·防火墙
腾飞开源2 小时前
01_K8s干货笔记之认识K8s
运维·笔记·云原生·容器·kubernetes·k8s·容器化部署
tg_xianheyun8 小时前
CDN节点分布如何影响网页加载速度和用户体验
服务器·cdn加速·全球访问优化
lsh曙光8 小时前
延时at指令和定时cron指令
linux·服务器·网络
圆山猫8 小时前
[Virtualization](四):Linux KVM/RISC-V 的 vCPU 运行路径
java·linux·risc-v
布鲁飞丝8 小时前
vivo Pulsar 万亿级消息处理实践()-Ansible运维部署
运维·ansible
XR1234567888 小时前
企业全光网络架构选型技术白皮书:从物理层到运维层的全链路分析
运维·网络·架构
似的8359 小时前
一步一步学习使用FireMonkey动画() 使用TAnimator类创建动画
linux·学习·nginx
HiDev_9 小时前
【非标自动化】2、认识元器件(直线模组)
运维·自动化
夏殇之殁10 小时前
包中创建自定义列表项。 . 使用自定义列表项进行数据绑定 . 将天气预报数据保存到本地内存表,通过LiveBindings进行显示。 ...
服务器·前端·javascript