当前位置: 首页 > article >正文

【linux进程】进程终止进程等待

目录

  • 一,进程终止
    • 1. 终止是在做什么
    • 2. 查看退出码和错误信息
    • 3. 三种退出场景的理解
    • 4. 如何终止
  • 二,进程等待
    • 1. 进程等待必要性
    • 2. 进程等待的方法
      • 1. wait 函数
      • 2. waitpid 函数

一,进程终止

1. 终止是在做什么

在这里插入图片描述

2. 查看退出码和错误信息

查看进程的退出码,
使用指令:echo $?

在这里插入图片描述

退出码可以自定义,一般而言,退出码为0表示正常退出,非0时表示代码运行正常,但是可能结果错误,这些非0值都有对应的错误描述:

使用man手册查看strerror函数:
在这里插入图片描述

代码演示:
在这里插入图片描述

3. 三种退出场景的理解

进程退出场景:

1. 代码运行完毕,结果正确
2. 代码运行完毕,结果不正确
3. 代码异常终止

在这里插入图片描述
在这里插入图片描述

结论:
衡量一个进程退出,我们只需要两个数字:退出码,退出信号!

4. 如何终止

进程常见退出方法:

正常终止
1. 从main返回
2. 调用exit
3. _exit
异常退出:
ctrl + c,信号终止

在这里插入图片描述
1. 参数:status 定义了进程的终止状态,父进程通过wait来获取该值
2. return 是一种更常见的退出进程方法。执行return n等同于执行exit(n),因为调用main的运行时函数会将main的返回值当做 exit的参数。

在这里插入图片描述

二,进程等待

1. 进程等待必要性

在这里插入图片描述

2. 进程等待的方法

1. wait 函数

在这里插入图片描述

代码演示:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2. waitpid 函数

在这里插入图片描述
在这里插入图片描述

下面对这个函数的三个参数进行解释和使用:
在这里插入图片描述

1. 演示第二个参数status:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

修改上面的代码,改成死循环,验证不同的退出码和退出信号:
在这里插入图片描述

2. 演示status里的几个宏:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.演示第三个参数option:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

代码演示:

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
	
	void childRun()
	{
	    int cnt = 5;
	    while(cnt--)
	    {
	        printf("I am a child process, pid: %d, ppid: %d\n", getpid(), getppid());
	        sleep(2);
	    }
	}
	
	int main()
	{
	    printf("father process is running... pid: %d, ppid: %d\n", getpid(), getppid());
    
	    pid_t id = fork();
	    if(id == 0)
	    {
	        // child
	        childRun();
	        printf("child process is running, pid: %d, ppid: %d\n", getpid(), getppid());
	        sleep(2);
	        exit(123);
	    }
	
	    // father
	    // 通过循环,进行非阻塞轮询
	    while(1)
	    {
	        int status = 0;
	        pid_t rid = waitpid(id, &status, WNOHANG);
	        if(rid == 0)
	        {
	            printf("child process not quit, check next time!\n");
	        }
	        else if(rid > 0)
            {   
	            // 已经等待成功了,检测一下退出情况
	            if(WIFEXITED(status))
	                printf("child quit success! child exit code: %d\n", WEXITSTATUS(status));
	            else
	                printf("child quit unnormal!\n");
	
	            break;
	        }
	        else
	        {
	            // 等待失败
	            printf("wait failed!\n");
	            break;
	        }
	    }
	
	    return 0;
	}

部分截图:
在这里插入图片描述


http://www.kler.cn/a/459284.html

相关文章:

  • Git 新手无忧:常用命令与错误解决攻略
  • Java 内存溢出(OOM)问题的排查与解决
  • 计算机网络•自顶向下方法:网络层介绍、路由器的组成
  • Java重要面试名词整理(十八):Sentinel
  • 网关的主要作用
  • ESP32-S3遇见OpenAI:OpenAI官方发布ESP32嵌入式实时RTC SDK
  • CSS(层叠样式表)基础选择器,文字控制属性
  • SpringBoot发邮件(带附件)
  • 《Vue进阶教程》第二十九课:立即执行的回调
  • OpenTK 光照与材质详解
  • 瓷砖缺陷检测数据集,使用yolo,coco json,pasical voc xml格式标注,可识别边缘崩裂,破洞,裂缝等缺陷,一共7992张原始图
  • 批量新建日报表只需10秒-Excel易用宝
  • HarmonyOS初步探索
  • [羊城杯 2024]miaoro
  • 嵌入科技的温情
  • 你有哪些Deep Learning(RNN、CNN)调参的经验?
  • Mysql(MGR)和ProxySQL搭建部署-Docker版本
  • 《云原生安全攻防》-- K8s安全配置:CIS安全基准与kube-bench工具
  • 【Go】Go数据类型详解—map
  • 2024.12.30(多点通信)
  • C语言-找出数组中两个数字的和为该数字的位置
  • 大数据面试笔试宝典之HBase面试
  • ECMAScript基础
  • Cypress测试框架详解:轻松实现端到端自动化测试
  • 项目总结-ElasticSearch性能优化考虑点
  • 飞搭系列 | 移动端列表批量选择:让数据处理更便捷