wait(),waitpid()函数

2023-11-02

首先我们来了解一下所谓的僵尸进程,

僵尸进程就是两个进程,一个父进程,一个子进程,其子进程终止后,0-3G的用户内存被回收,而3-4G的部分内存被回收,但是3-4G内存中的PCB等待父进程回收,若PCB未被父进程回收,我们称这个进程为僵尸进程,

注,之所以保留PCB,是因为其中保存着子进程的终止状态

父进程回收子进程的资源所用到的函数就是我们今天所要说的wait()和waitpid()函数

那么我们先来了解一下wait函数

wait是一个阻塞函数,如果没有可以回收的子进程,则为阻塞状态

                                  如果无子进程,则返回-1

                                    如果回收成功,则返回子进程的pid

返回值pid_t

wait()  只有一个参数 可以为NULL,也可以为int* status

所需要的头文件

#include<sys/type.h>

#include<sys/wait.h>


而waitpid()是对wait()函数的优化,我们在父进程使用wait()函数时,因为这个函数是处于阻塞状态的,使父进程不能处理其他事情,这样便浪费了父进程的资源,所以我们引出了waitpid()

waitpid()非阻塞 函数有三个参数

参数1:<-1时 回收组ID(该组可为用户指定)

            -1 时 回收任意的相关进程

            0 时,回收调用者组中的子进程

            >0时,回收一个指定进程

参数2:可为NULL也可为int* status 为子进程的终止情况(退出码)

参数3:WNOHANG 为非阻塞状态

返回值  -1:失败或者没有回收子进程返回-1

               >0: 返回回收的子进程ID

                0:代表子进程未结束,非阻塞轮询返回

注:参数2为传出参数 使用宏函数 WIFEXITED(status)

                                                    WEXITSTATUS(status)

                                                    WIFSIGNALED(status)

                                                    WTERMSIG(status)

前两个宏函数为一组 ,后两个宏函数为一组,前两个是正常退出,后两个代表信号退出

下面我们来看一下代码:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <string.h>
#include <sys/types.h>


int main(void)
{
		pid_t pid,wpid;
		int status,i;//子进程的终止
		for(i=0;i<10;i++){
				pid = fork();
				if(pid == 0)
						break;
		}
		if(pid > 0){
				printf("parent pid=%d\n",getpid());
				//wait阻塞函数,如果没有可回收子进程阻塞,如果没有子进程返回-1,如果回收成功返回子进程pid
				//waipid return value:-1,>0,0
				//-1:没有可回收子进程
				//>0:返回回收子进程pid
				//0:代表子进程未结束,非阻塞轮询返回
				while((wpid = waitpid(-1,&status,WNOHANG))!=-1){	
						if(wpid > 0)
						{
								if(WIFEXITED(status))
										printf("parent wait child pid:%d\texit code:%d\n",wpid,WEXITSTATUS(status));
								if(WIFSIGNALED(status))
										printf("parent wait child pid:%d\tsignal No:%d\n",wpid,WTERMSIG(status));
						}

				}
		}else if(pid == 0){
				printf("child id=%d\tpid=%d\n",i,getpid());
				if(i<9){
						sleep(i);
						exit(i);
				}
				while(1);
		}else{
				perror("Fork Call Failed:");
				exit(0);
		}

		return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

wait(),waitpid()函数 的相关文章

  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 为什么 Linux 没有 DirectX API?

    在考虑现代显卡的 Windows 系统上 DirectX API 的驱动程序端实现时 我想知道为什么此实现在非 Windows 系统 尤其是 Linux 上不可用 由于明显缺乏此功能 我只能假设有一个我无视的充分理由 但在我的原始理解中 我
  • docker 非 root 绑定安装权限,WITH --userns-remap

    all 尝试让绑定安装权限正常工作 我的目标是在容器中绑定安装卷 以便 a 容器不以 root 用户身份运行入口点 二 docker daemon 配置了 userns remap 这样容器 主机上没有 root c 我可以绑定挂载和读 写
  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • 如何在 Ubuntu 中创建公共 HTML 文件夹?

    简单的问题 但由于某种原因我无法在谷歌上找到确切的答案 我在 Slicehost 上安装了全新的 Ubuntu 并且想在我的主目录中为包含一堆静态 HTML 文件的简单网站创建一个公共目录 我该怎么做呢 只是打字的问题吗mkdir publ
  • Linux 上的 Pervasive ODBC 错误 [01000][unixODBC][驱动程序管理器]无法打开 lib '/usr/local/psql/lib/odbcci.so':找不到文件

    我正在尝试让 Pervasive v10 客户端 ODBC 在 Centos 6 上运行 据我所知 没有 64 位 ODBC 客户端 因此我必须使用 32 位客户端 我终于成功安装了它 但尝试使用时出现以下错误 isql v mydsn 0
  • 如何根据标签将单个 XML 文件拆分为多个

    我有一个带有标签的 XML 文件 我想像这样分割文件
  • 如何使用waf构建共享库?

    我想使用构建一个共享库waf http code google com p waf 因为它看起来比 GNU 自动工具更容易 更简洁 到目前为止 我实际上有几个与我开始编写的 wscript 有关的问题 VERSION 0 0 1 APPNA
  • 与 pthread 的进程间互斥

    我想使用一个互斥体 它将用于同步对两个不同进程共享的内存中驻留的某些变量的访问 我怎样才能做到这一点 执行该操作的代码示例将非常感激 以下示例演示了 Pthread 进程间互斥体的创建 使用和销毁 将示例推广到多个进程作为读者的练习 inc
  • 如何在 Linux 中使用 C 语言使用共享内存

    我的一个项目有点问题 我一直在试图找到一个有据可查的使用共享内存的例子fork 但没有成功 基本上情况是 当用户启动程序时 我需要在共享内存中存储两个值 当前路径这是一个char and a 文件名这也是char 根据命令参数 启动一个新进
  • linux下如何从文本文件中获取值

    我有一些文本格式的文件 xxx conf 我在这个文件中有一些文本 disablelog 1 当我使用 grep r disablelog oscam conf 输出是 disablelog 1 但我只需要值1 请问你有什么想法吗 一种方法
  • 如何使用Android获取Linux内核的版本?

    如何在 Android 应用程序中获取 Linux 内核的版本 不是 100 确定 但我认为调用 uname r 需要 root 访问权限 无论如何 有一种不太肮脏的方法可以做到这一点 那就是 System getProperty os v
  • 使用 gdb 调试 Linux 内核模块

    我想知道 API 在内核模块 中返回什么 从几种形式可以知道 这并不是那么简单 我们需要加载符号表来调试内核模块 所以我所做的就是 1 尝试找到内核模块的 text bss和 data段地址 2 在 gdb 中使用 add symbol f
  • Linux/POSIX:为什么 fork() 不分叉*所有*线程

    众所周知 POSIX下创建新进程的默认方式是使用fork 在 Linux 下 这在内部映射到clone 我想知道的是 众所周知 当一个人打电话时fork 子进程是用单个线程创建的 调用的线程fork cf https linux die n
  • 我什么时候应该编写 Linux 内核模块?

    有些人出于某种原因想要将 Linux 中的代码从用户空间移动到内核空间 很多时候 原因似乎是代码应该具有特别高的优先级 或者只是 内核空间更快 这对我来说似乎很奇怪 我什么时候应该考虑编写内核模块 有一套标准吗 我怎样才能激励将代码保存在
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser

随机推荐

  • ElasticSearch自定义评分-看这篇就够了

    文章目录 一 适用的场景 1 基本介绍 2 使用场景 2 1根据价格评分排序 2 2根据距离评分排序 2 3根据距离价格综合评分排序 2 4自定义编写脚本 二 常用的字段解释 1 整体结构 2 function score 2 1 quer
  • [leetcode 周赛 148] 1145 二叉树着色游戏

    目录 1145 Binary Tree Coloring Game 二叉树着色游戏 描述 思路 代码实现 1145 Binary Tree Coloring Game 二叉树着色游戏 描述 有两位极客玩家参与了一场 二叉树着色 的游戏 游戏
  • python中if__name__=='__main__'_python中的if __name__=='__main__': main()解析

    python中我们会看到一段代码是这样的 1 if name main 2 main 这段代码的什么意思 我们可以知道代码的意思是如果 name main 为Ture 则调用main 函数 有句话经典的概括了这段代码的意义 Make a s
  • OSCS开源安全周报第 55 期:JeecgBoot 远程代码执行漏洞

    本周安全态势综述 OSCS 社区共收录安全漏洞 11 个 公开漏洞值得关注的是 JeecgBoot 远程代码执行漏洞 企业微信私有化后台API未授权访问漏洞 WPS Office 存在代码执行漏洞 MPS 3pcb l4mv Microso
  • 前端常用的跨域方案

    目录 前言 跨域 解决跨域方案 一 修改本地HOST 二 JSONP 三 CORS 四 proxy 前言 发送请求XMLHttpRequest ajax ajax axois fetch http 192 168 0 103 8080 fi
  • Google Colab启动TensorFlow出现No dashboards are active for the current data set.

    我在Colab上面跟着federated learning for image classification教程做相关的东西 在用到tensorbord的时候 使用如下代码 test skip true load ext tensorboa
  • Android 大图显示优化方案-加载Gif 自定义解码器

    基于Glide做了图片显示的优化 尤其是加载Gif图的优化 原生Glide加载Gif图性能较低 在原生基础上做了自定义解码器的优化 提升Glide性能 Glide加载大图和Gif 尤其是列表存在gif时 会有明显卡顿 cpu和内存占用较高
  • JS中版本号的比较(AI)

    在 JavaScript 中 您可以使用字符串比较算法比较版本号 版本号通常采用 x y z 格式 其中 x y 和 z 均为数字 表示主版本号 次版本号和修订版本号 以下是比较版本号的一些示例代码 示例1 简单比较 AI 您可以使用比较运
  • 线性调频脉冲压缩

    线性调频脉冲压缩 LFM信号的数学表达式为 式中为f c载波频率 rect t T 为矩形信号 K B T是调频斜率 信号的顺势频率为f c Kt T 2 t T 2 典型线性调频信号如下图 在MATLAB中实验结果如下 在远场设置了一个目
  • 3. 自建DNS(bind9)

    3 自建DNS bind9 扩展关键词 web dns NamedManager 是一个基于Web的DNS管理系统 注意 下文操作是在172 10 10 11机器上处理的 关键配置注意对应 各主机ip 及其hostname的设置 一 bin
  • C++中class关键字

    在C 语言中class是定义类的关键字 C 中也可以使用struct定义类 两者区别是 用class定义的类 如果数据成员或成员函数没有说明则默认为private 私有 的 而用struct定义的 默认为public 公共 的 示例 inc
  • Vue-Vue列表渲染v-for

    v for 指令需要以 site in sites 形式的特殊语法 一 v for 循环数组 HTML代码 div ul li item li ul div JS代码 new Vue el app data list red green b
  • 数据结构中常见的树

    哈夫曼树 Huffman Tree 哈夫曼树 又被称为最优二叉树 属于带权值二叉树的一种 它的真实节点全部分布在叶子节点中 是各种可能的组合中 WPL 值最小的形式 组合形式可能不唯一 但 WPL 值一定为最小 介绍一下 WPL Weigh
  • c语言repeat语句的用法,关于Lua中的repeat...until循环语句的使用教程

    关于Lua中的repeat until循环语句的使用教程 这篇文章主要介绍了Lua中的repeat until循环语句使用教程 是Lua入门学习中的基础教程 需要的朋友可以参考下与for和while循环不同 在循环的顶部测试循环条件 Lua
  • 【JavaWeb】PowerDesigner的使用

    PowerDesigner 数据库设计的工具 01 PowerDesigner概述 02 数据模型 2 1 概念数据模型 2 1 1 PowerDesigner使用之概念数据模型 2 1 2 根据概念模型生成物理模型 2 2 物理数据模型
  • C# 参数中this 表示扩展扩展方法

    怎么使用 public static SlicedHull Slice this GameObject obj Vector3 position Vector3 direction Material crossSectionMaterial
  • IOTCS+Ekuiper搭建物联网边缘计算平台

    背景介绍 IOTCS 是专为物联网平台而设计的工业智能网关 自从 2020 年 10 月以来 我们从需求调研 设计 定型 研发 测试经过漫长的沉淀与孵化 最终顺利实现工业智能网关最初的设想 我们凭借创新设计理念 快捷的安装以及部署 易用的扩
  • pycharm+pyqt5:CreateProcess error=5,拒绝访问

    问题背景 使用pyqt5来做python的图形界面程序开发实验 提前安装并配置了相关环境 弄了一下午 终于弄好了 总体的安装教程就不多说了 说说我遇到的错误叭 问题分析 通过命令行下载好相关工具后 需要使用pycharm的external
  • ant利用正则表达式获取文件夹名

  • wait(),waitpid()函数

    首先我们来了解一下所谓的僵尸进程 僵尸进程就是两个进程 一个父进程 一个子进程 其子进程终止后 0 3G的用户内存被回收 而3 4G的部分内存被回收 但是3 4G内存中的PCB等待父进程回收 若PCB未被父进程回收 我们称这个进程为僵尸进程