Linux中孤儿/僵尸进程/wait/waitpid函数

2024-02-10 18:52

本文主要是介绍Linux中孤儿/僵尸进程/wait/waitpid函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

孤儿进程:

概念:若子进程的父进程已经死掉,而子进程还存活着,这个进程就成了孤儿进程。

为了保证每个进程都有一个父进程,孤儿进程会被init进程领养,init进程成为了孤儿进程的养父进程,当孤儿进程退出之后,由init进程完成对孤儿进程的回收。init进程的pid=1。

 僵尸进程:

概念:子进程先退出,父进程没有完成对子进程资源的回收(父进程还没结束),此时子进程就变成了僵尸进程。

如何解决:

不能使用kill -9直接杀死僵尸进程,原因是僵尸进程是一个死掉的进程。

应该使用杀死僵尸进程父进程的方法来解决僵死进程;

原因是:杀死其父进程可以让init进程领养僵尸进程,最后由init进程回收僵尸进程(init进程回收已经结束的进程)。

wait函数:

函数原型:  pid_t wait(int *wstatus);

函数作用:

  • 阻塞并等待子进程退出。
  • 回收子进程残留资源。
  • 获取子进程结束状态(退出原因)

返回值:

  • 成功:清理掉的子进程的pid
  • 失败:-1(没有子进程) 

wstatus参数:

1 WIFEXITED(wstatus):为非零->进程正常结束

   WEXITSTATUS(wstatus):获取进程退出状态(return ...)

2  WIFSIGNALED(wstatus):为非零->进程异常结束(被信号杀死)

    WTERMSIG(wstatus):取得进程终止的信号编号

结果:

waitpid函数:

函数原型: pid_t waitpid(pid_t pid, int *wstatus, int options);

函数参数:

pid:

< -1   meaning  wait  for  any  child process whose process group ID isequal to the absolute value of pid.-1     meaning wait for any child process.0      meaning wait for any child process whose  process  group  ID  isequal  to that of the calling process at the time of the call towaitpid().> 0    meaning wait for the child whose process  ID  is  equal  to  thevalue of pid.

pid=-1 等待任一子进程。与wait等效。

pid>0 等待其进程id与pid相等的子进程。

options:设置为WNOHANG,函数为非阻塞,设置为0,函数阻塞。(阻塞的话父进程执行不了剩余的代码,除非子进程全部回收)

函数返回值:

>0:返回回收掉的子进程id

=-1:无子进程

=0:参数三为WNOHANG,且子进程正在运行。

使用:

  1 #include<stdio.h>2 #include<stdlib.h>3 #include<string.h>4 #include<sys/types.h>5 #include<unistd.h>6 #include <sys/wait.h>7 int main()8 {9     //pid_t fork(void);10     pid_t pid=fork();11     if(pid<0)12     {13         perror("fork error");14         return -1;15     }16     else if(pid==0)17     {18         printf("child:pid==[%d],fpid=[%d]\n",getpid(),getppid());19         sleep(1);20         return 33;21     }22     else if(pid>0)23     {24         printf("father:pid==[%d],fpid=[%d]\n",getpid(),getppid());25         // pid_t wait(int *wstatus);26         int wstatus;27         // pid_t waitpid(pid_t pid, int *wstatus, int options);28         while(1)29         {30             pid_t wpid=waitpid(-1,&wstatus,WNOHANG);31             if(wpid>0)32             {33                 printf("child:[%d] terminated\n",wpid);34                 if( WIFEXITED(wstatus))35                 {36                     printf("child normal exit,wstatus=[%d]\n",WEXITSTATUS(wstatus));37 38                 }39                 else if( WIFSIGNALED(wstatus))40                 {41                     printf("child killed by signal,signo=[%d]\n",WTERMSIG(wstatus));42                 }43             }44             else if(wpid==0)45             {46                 printf("child is living\n");47             }48             else if(wpid=-1)49             {50                 printf("no child is living\n");51                 break;52             }53         }54     }55     return 0;56 }

因为我们使用了WNOHANG让waitpid处于不阻塞状态,我们可以使用while(1)让其陷入无限循环,wpid=0时说明子进程还没结束,wpid=-1时,已经不存在子进程,break退出循环。

结果:

wait和waitpid调用一次只能清理一个子进程 

这篇关于Linux中孤儿/僵尸进程/wait/waitpid函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/697837

相关文章

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程

Linux之进程状态&&进程优先级详解

《Linux之进程状态&&进程优先级详解》文章介绍了操作系统中进程的状态,包括运行状态、阻塞状态和挂起状态,并详细解释了Linux下进程的具体状态及其管理,此外,文章还讨论了进程的优先级、查看和修改进... 目录一、操作系统的进程状态1.1运行状态1.2阻塞状态1.3挂起二、linux下具体的状态三、进程的