【Linux操作系统】进程等待

news2024/11/22 19:46:29

目录

  • 一、什么是进程等待?
  • 二、为什么要进行等待?
  • 三、进程等待方法
    • 1.wait函数
    • 2.waitpid
    • 3.status
    • 阻塞等待和非阻塞等待(轮询等待)
      • 1.阻塞等待
      • 2.非阻塞等待
  • 四、代码举例

一、什么是进程等待?

"进程等待"是指一个进程因为某些原因暂时无法继续执行,而必须等待某个条件满足或某个事件发生后才能继续执行的状态,是操作系统进行资源管理、任务调度和同步协调的重要机制之一。

通俗来讲就是我需要得到我想要的结果,我才能执行下一步

本文主要讲解父子进程之间的等待关系

二、为什么要进行等待?

首先我们要知道,在一个子进程退出时,父进程必须要回收子进程

即在子进程退出后,父进程需要知道交给子进程的任务是否完成,如果完成,是对了还是不对,如果没有完成,又是为什么,又是否正常退出

如果父进程没有回收好子进程的退出信息,子进程就会变成僵尸进程,从而导致内存泄漏问题

因此,父进程就会通过进程等待的方式,回收子进程资源,获取子进程的退出信息

三、进程等待方法

1.wait函数

#include<sys/types.h>
#include<sys/wait.h>

pid_t wait(int* status);

返回值: 成功返回被等待进程pid,失败返回-1。

status参数: 输出型参数,获取子进程退出状态,不关心则可以设置成为NULL

2.waitpid

#include<sys/types.h>
#include<sys/wait.h>

pid_ t waitpid(pid_t pid, int *status, int options);

返回值:

  • 成功时返回结束或暂停的子进程ID;

  • 如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;

  • 如果调用中出错,则返回-1,并设置errno来指示错误原因,这时errno会被设置成相应的值以指示错误所在

参数:

pid:

  • pid = -1:等待任意一个子进程。与wait等效。
  • pid > 0:等待其进程ID与pid相等的子进程。
  • pid = 0:等待与调用进程同组的任何子进程
  • pid < -1:等待进程组ID等于-pid的任何子进程。

options:

  • WNOHANG:如果指定的子进程没有结束,则waitpid立即返回0,而不是阻塞等待,若正常结束,则返回该子进程的ID。
  • WUNTRACED:如果子进程处于暂停状态(如由于接收到信号而暂停),则waitpid会返回该子进程的ID。

status:

  • 用于保存子进程的退出状态。

注意:

  1. 如果子进程已经退出,调用wait/waitpid时,wait/waitpid会立即返回,并且释放资源,获得子进程退出信息。
  2. 如果在任意时刻调用wait/waitpid,子进程存在且正常运行,则进程可能阻塞。
  3. 如果不存在该子进程,则立即出错返回。
    在这里插入图片描述

3.status

  • wait和waitpid,都有一个status参数,该参数是一个输出型参数,由操作系统填充
  • 如果传递NULL,表示不关心子进程的退出状态信息,否则,操作系统会根据该参数,将子进程的退出信息反馈给父进程

status 可以放回子进程的退出码和退出信号,是用来反馈子进程退出情况的

status不能简单的当作整形来看待,可以当作位图来看待,具体就涉及到进程信号的知识了

在这里插入图片描述

阻塞等待和非阻塞等待(轮询等待)

1.阻塞等待

阻塞等待很简单,也就是在没有得到你所等待的资源前,我就死板的一直等,等到海枯石烂

2.非阻塞等待

非阻塞等待又叫做轮询等待,即再等待某资源的同时还可以做其他事情

比如进程在等待某资源时,进程可以每过一段时间询问一下有没有资源,如果有就等待结束,如果没有就可以执行其他任务,然后过一段时间再次询问,然后往复循环这个过程

四、代码举例

1.阻塞等待

#include<iostream>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
using namespace std;

int main(int argc,char* argv[])
{
    pid_t pid = fork();
    if(pid==0)
    {
        cout<<"i am child process"<<endl;
        sleep(5);
        exit(100);
    }
    int status=0;
    //打印子进程的退出信号,coredump标志位,退出码
    pid_t wit =waitpid(pid,&status,0);
    if(wit==pid)
    {
        //子进程正常退出
        if(WIFEXITED(status))
        {
            //退出码
            cout<<"退出码:"<<WEXITSTATUS(status)<<endl;
            //退出信号
            cout<<"退出信号:"<<WTERMSIG(status)<<endl;
            //core dump信号,对于正常退出的进程,core dump 标志位总是 0
            cout<<"core dump:"<<WCOREDUMP(status)<<endl;
        }
        else
        {
            cout<<"fail"<<endl;
        }
    }

    return 0;
}

2.非阻塞等待

#include <stdio.h> 
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main()
{
	pid_t pid;

	pid = fork();
	if (pid < 0) {
		printf("%s fork error\n", __FUNCTION__);
		return 1;
	}
	else if (pid == 0) { //child
		printf("child is run, pid is : %d\n", getpid());
		sleep(5);
		exit(1);
	}
	else {
		int status = 0;
		pid_t ret = 0;
		do
		{
			ret = waitpid(-1, &status, WNOHANG);//非阻塞式等待
			if (ret == 0) {
				printf("child is running\n");
			}
			sleep(1);
		} while (ret == 0);

		if (WIFEXITED(status) && ret == pid) {
			printf("wait child 5s success, child return code is :%d.\n", WEXITSTATUS(status));
		}
		else {
			printf("wait child failed, return.\n");
			return 1;
		}
	}
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2216703.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于springboot摄影跟拍预定管理系统

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的&#xff0c;前后端分离。 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;…

Finops成本优化企业实践-可规划篇

引言&#xff1a;本篇假设我们要在云上新增一个应用&#xff0c;讨论其在单体、failover、DR、集群模式下的成本规划。 假设该应用base on Linux&#xff0c;硬件要求是8cores、64G mem的云主机&#xff0c;并搭配500g内存&#xff0c;至少部署在一台云主机上。我们有开发、测…

Java项目: 基于SpringBoot+mysql+maven+vue林业产品推荐系统(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismavenvue林业产品推荐系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操…

【Linux】解锁软硬链接奥秘,高效动静态库管理的实战技巧

软硬连接和动静态库 1. 软链接1.1. 概念1.2. 特点1.3. 应用场景 2. 硬链接2.1. 概念2.2. 硬链计数2.3. 特点2.4. 应用场景 3. 动静态库3.1 库存在的原因3.2. 静态库制作与使用3.2.1 打包3.2.2. 使用 3.3. 动态库制作与使用3.3.1. 打包3.3.2. 使用 4. 解决动态库查不到的4种方法…

GStreamer 简明教程(七):实现管道的动态数据流

系列文章目录 GStreamer 简明教程&#xff08;一&#xff09;&#xff1a;环境搭建&#xff0c;运行 Basic Tutorial 1 Hello world! GStreamer 简明教程&#xff08;二&#xff09;&#xff1a;基本概念介绍&#xff0c;Element 和 Pipeline GStreamer 简明教程&#xff08;三…

多场景多任务建模(三): M2M(Multi-Scenario Multi-Task Meta Learning)

多场景建模: STAR(Star Topology Adaptive Recommender) 多场景建模&#xff08;二&#xff09;: SAR-Net&#xff08;Scenario-Aware Ranking Network&#xff09; 前面两篇文章&#xff0c;讲述了关于多场景的建模方案&#xff0c;其中可以看到很多关于多任务学习的影子&…

OGG错误:ORA-28000:the account is locked

问题描述 问题分析 从错误看&#xff0c;应该是ogg的角色锁定了&#xff0c;需要解锁 解决方案 解锁用户 SQL> alter user GGR_OGSREPO account unlock;

【Spring】Spring实现加法计算器和用户登录

加法计算器 准备工作 创建 SpringBoot 项目&#xff1a;引入 Spring Web 依赖&#xff0c;把前端的页面放入项目中 **<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport"…

Linux介绍及常用命令

Linux 系统简介 1969 年&#xff0c;AT&T 公司的⻉尔实验室P MIT 合作开发的 Unix&#xff0c;在于创建⼀个⽤于⼤型、并⾏、多⽤户的操作系统Unix 的推⼴&#xff1a;从学校⾛进企业Unix 的版本要两个&#xff1a; AT&T System V ——就是俗称的 系统 5Berkley Soft…

Linux中文件的理解

✨前言✨ &#x1f4d8; 博客主页&#xff1a;to Keep博客主页 &#x1f646;欢迎关注&#xff0c;&#x1f44d;点赞&#xff0c;&#x1f4dd;留言评论 ⏳首发时间&#xff1a;2024年10月16日 &#x1f4e8; 博主码云地址&#xff1a;渣渣C &#x1f4d5;参考书籍&#xff1a…

如何使用Nessus软件

Nessus&#xff08;Win2022虚拟机已安装&#xff09; [ root root ] 访问https://127.0.0.1:8834 如果出现以下问题 解决方法&#xff1a; 1.在地址栏输入&#xff1a;about:config 2.在搜索框 输入&#xff1a;security.enterprise_roots.enabled 将值切换为true即可。…

Java算法竞赛之getOrDefault()--哈希表最常用API!

解释: for (char ch : magazine.toCharArray()) { charCount.put(ch, charCount.getOrDefault(ch, 0) 1); } 在Java中&#xff0c;HashMap 是一个用于存储键值对的数据结构&#xff0c;其中每个键都是唯一的。put 方法用于将指定的键与值放入 Has…

AI控制工业机器人入门教程

简介 AI控制的工业机器人正在改变现代制造业的面貌。与传统的编程控制不同&#xff0c;AI使机器人能够通过感知环境、自主决策和学习不断优化自身的操作。这篇教程将介绍实现AI控制工业机器人的必要知识和技能&#xff0c;帮助读者从基础开始构建起AI控制机器人的理解和能力。…

TypeScript新手学习教程--接口

TypeScript 也支持接口&#xff0c;跟Java类似&#xff0c;这对于学习过java&#xff0c;c#&#xff0c;php语言的人更容易上手&#xff0c;虽然类似&#xff0c;但是也有不同&#xff0c;下面开始学习。 1、 接口声明 TypeScript的核心原则之一是对值所具有的结构进行类型检…

anaconda(jupyter)安装教程

目录 一、下载anaconda安装包 二、安装程序 三、怎么使用 四、把jupyter界面语言修改成中文 一、下载anaconda安装包 anaconda官网&#xff1a;下载 Anaconda Distribution |蟒蛇 清华大学开源软件镜像站官网&#xff1a;清华大学开源软件镜像站 | Tsinghua Open Source M…

Linux服务部署,遇到的各种问题之一(测试篇)

最近服务器需要搬迁&#xff0c;所有的服务都需要迁移&#xff0c;从初始化数据盘&#xff0c;到服务部署的各种细节&#xff0c;下面我们一一来说 初始化数据盘就不用说了&#xff0c;大概率&#xff0c;作为测试接触不到。 今天来说是ubuntu显示的中文文件乱码问题如何解决…

SpringBoot集成Mongodb实现增删改查操作

目录 一、Mongodb概念 二、SpingBoot集成Mongodb 三、实现增删改查操作 一、Mongodb概念 MongoDB是一个开源的文档型数据库&#xff0c;属于NoSQL数据库中的一种。它使用BSON&#xff08;类似于JSON&#xff09;格式存储数据&#xff0c;具有高性能、高可用性和易于扩展的特…

QT--文本框 QLineEdit、qtextedit

在Qt中&#xff0c;文本框&#xff08;QLineEdit 或 QTextEdit&#xff09;和标签&#xff08;QLabel&#xff09;是两种不同的部件&#xff08;widget&#xff09;&#xff0c;它们的主要区别在于用途和功能&#xff1a; QLabel&#xff08;标签&#xff09; 用途&#xff1…

JVM(HotSpot):直接内存及其使用建议

文章目录 一、什么是直接内存&#xff1f;二、特点三、使用案例四、直接内存的管理 一、什么是直接内存&#xff1f; Direct Memory&#xff1a;系统内存 普通IO&#xff0c;运行原理图 磁盘到系统内存&#xff0c;系统内存到jvm内存。 NIO&#xff0c;运行原理图 划分了一块…

『Mysql集群』Mysql高可用集群之主从复制 (一)

Mysql主从复制模式 主从复制有一主一从、主主复制、一主多从、多主一从等多种模式. 我们可以根据它们的优缺点选择适合自身企业情况的主从复制模式进行搭建 . 一主一从 主主复制 (互为主从模式): 实现Mysql多活部署 一主多从: 提高整个集群的读能力 多主一从: 提高整个集群的…