首页 > 系统相关 >Linux系统下进程回收--wait()函数

Linux系统下进程回收--wait()函数

时间:2023-04-01 10:14:16浏览次数:44  
标签:函数 -- int Linux 进程 include waitpid wait

进程回收

  • 在每个进程退出的时候,内核释放该进程所有资源‘包括打开的文件、占用的内存等。但是仍然会保存一定的信息,这些信息主要是进程控制块PCB的信息(包括进程号、退出状态、运行时间等)。
  • 父进程可以调用wait()或waitpid()函数得到它的退出状态,同时彻底清除这个进程。
  • wait()函数和waitpid()函数的功能一样,区别在于wait()函数会阻塞,waitpid()函数可以设置不阻塞,waitpid()还可以指定等待哪个子进程结束。
  • 注意:一次wait或者waitpid调用只能清理一个子进程,清理多个子进程应使用循环。

wait()函数

在Linux终端下使用命令:man 2 wait查看wait函数的具体描述:

NAME
       wait, waitpid, waitid - wait for process to change state

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

        pid_t wait(int *wstatus);
            作用:
                等待任意一个子进程结束,如果任意一个子进程结束了,该函数就会回收子进程的资源。
            参数:
                int *wstatus:进程退出时的状态信息,传入的是一个int类型的地址,传出参数。
            返回值:
                - 成功:返回被回收的子进程的id
                - 失败:返回-1(调用函数失败,或者所有子进程都被回收)

            调用wait函数的进程会被挂起(阻塞),直到它的一个子进程退出或者收到一个不能被忽略的信号时才被唤醒(相当于继续往下执行).
            如果没有子进程,函数立刻返回-1,如果子进程都已经结束了,也会立刻返回-1.

下面是wait函数的简单案例:

#include <iostream>
#include <unistd.h>
#include <stdlib.h>

using std::cout;
using std::endl;

namespace wait_test{

    void test(){

        //有一个父进程创建5个子进程
        pid_t pid;

        //创建5个子进程
        for(int i=0;i<5;++i){
            pid = fork();
            if(pid == 0)
                break;
        }

        if(pid>0){
            //父进程
            while(1){
                cout<<"parent,pid:"<<getpid()<<endl;

                //int ret = wait(NULL);
                int st;
                int ret = wait(&st);

                if(ret == -1)
                    break;
                
                if(WIFEXITED(st))
                    //是不是正常退出
                    cout<<"退出的状态码:"<<WEXITSTATUS(st)<<endl;
                if(WIFSIGNALED(st))
                    //是不是异常终止
                    cout<<"被哪个信号干掉了:"<<WTERMSIG(st)<<endl;
                cout<<"child has died,pid:"<<ret<<endl;
                sleep(1);
            }
        }
        else if(pid == 0){
            //子进程
            //while(1){
            cout<<"child, pid:"<<getpid()<<endl;
            sleep(1);    
            //}
            exit(0);
        }
    }

    
}


int main(){

    wait_test::test();
    //waitpid_test::test();
    return 0;
}

标签:函数,--,int,Linux,进程,include,waitpid,wait
From: https://www.cnblogs.com/nakjima/p/17275892.html

相关文章

  • 【THM】Windows Fundamentals 1(Windows基础知识1)-学习
    本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/windowsfundamentals1xbx本文介绍:本文所涉及的内容是Windows基础模块的第1部分,我们将了解Windows桌面、NTFS文件系统、UAC、控制面板等Windows基础组件。简介Windows操作系统(OS)是一个复杂的产品,有许多系统......
  • gin08-时间戳转时间
    循环赋值forindex,r:=rangeres{t:=r.AddTimeres[index].FriendTime=time.Unix(t,0).Format("2006-01-0215:04:05")} packagemainimport("time""fmt")funcmain(){//获取当前时间t:=time.Now()//201......
  • jdk+maven 配置与环境
    jdk1.8maven++++++++++++++++++++安装Java解压maven===================================环境变量JAVA_HOME   E:\java\jdk1.8.0_361MAVEN_HOME  E:\apache-maven-3.9.0path添加  %JAVA_HOME%\bin%MAVEN_HOME%\bin=====================================/c......
  • 【LBLD】小而美的算法技巧:前缀和数组
    【LBLD】小而美的算法技巧:前缀和数组一维数组中的前缀和classNumArray{private:vector<int>preSum;public:NumArray(vector<int>&nums){preSum.push_back(0);for(inti=1;i<nums.size()+1;i++){preSum.push_back(......
  • 算术三元组的数目
    给你一个下标从0开始、严格递增的整数数组nums和一个正整数diff。如果满足下述全部条件,则三元组(i,j,k)就是一个算术三元组:i<j<k,nums[j]-nums[i]==diff且nums[k]-nums[j]==diff返回不同算术三元组的数目。示例1:输入:nums=[0,1,4,6,7,10],......
  • Python: issues
     'import*'onlyallowedatmodulelevelWhenPythoncompilescodeitneedsadeterminednumberoflocalvariables,Thenumberofvariablesthatimport*canreturncanchangeaftercodeiscompiled.foo=55deffunc():fromsome_modulei......
  • 2023年4月1日09:56:44计划
    昨天晚上玩手机睡挺晚的,以后如果睡不着就听歌,不能老玩手机。昨天的Git 克隆速度太慢了,还不如自己的gitHut加速器,去买个Git加速器又不划算,所以算了,算白学了,因为自己也没有一定要去上传什么项目到Github上。昨天的有效数组还是没有解决,但自己写了一到算法题,今天要把剩下的解决,并......
  • x210-2023-03-31
    1、在参考网上的一些开启NFS文章时,发现有一个问题,就是他们在---NetworkFileSystems底下都有一个[]RootFilesystemonNFS,但是自己配置这里却没有,而且刚开始的时候也是弄不出来,然后去网上查了个遍,有说直接修改xxx_defconfig文件添加CONFIG_NFS_FS=y、CONFIG_IP_PNP=y的,可是加......
  • 推荐一款不烧钱的传奇类手游最适合平民传奇类手游?(有什么好玩又不花钱的传奇类手游)
    今儿咱们聊一聊热血传奇里那一些赫赫有名的大佬游戏玩家。不管什么游戏都会有二种游戏玩家,一种是豹子头‘林冲’另一种是氪金大佬,不氪金的游戏玩家呢要想得到游戏乐趣感只可以去肝,又称肝帝!大佬游戏玩家呢玩命砸钱,战斗力等级飞速上升,那速度媲美火箭。热血传奇尽管并不是国内首款网......
  • 《Mysql基础-1》【新建数据库】 【新建表】编程入门 学习分享 公开免费
    --mysql数据库程序设计笔记:--mysql安装路径my.ini中把:default-character-set=utf8改为default-character-set=gbk后重启客户端。--创建数据库:createdatabasedb_schooldefaultcharsetgb2312collategb2312_chinese_ci;usedb_school;--1、学生表:createtabletb_s......