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

目录

  • 一,进程终止
    • [1. 终止是在做什么](#1. 终止是在做什么)
    • [2. 查看退出码和错误信息](#2. 查看退出码和错误信息)
    • [3. 三种退出场景的理解](#3. 三种退出场景的理解)
    • [4. 如何终止](#4. 如何终止)
  • 二,进程等待
    • [1. 进程等待必要性](#1. 进程等待必要性)
    • [2. 进程等待的方法](#2. 进程等待的方法)
      • [1. wait 函数](#1. wait 函数)
      • [2. waitpid 函数](#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:


代码演示:

c 复制代码
#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;
	}

部分截图:

相关推荐
山峰哥9 分钟前
SQL调优实战:从索引失效到性能飙升的破局之道
服务器·数据库·sql·性能优化·编辑器·深度优先
玩具猴_wjh10 分钟前
JWT优化方案
java·服务器·数据库
yangyanping2010813 分钟前
系统监控Prometheus之Docker安装部署Prometheus
运维·docker·容器·prometheus
盟接之桥24 分钟前
制造业EDI数字化:连接全球供应链的桥梁
linux·运维·服务器·网络·人工智能·制造
一点多余.30 分钟前
openGauss 企业版安装全流程指南
linux·数据库·opengauss·企业版
XiaoHu020741 分钟前
Linux网络编程(第四弹)
linux·网络·智能路由器
金刚猿1 小时前
03_虚拟机中间件部署_Nacos 部署单机模式、配置鉴权
linux·中间件·nacos·配置鉴权
大梦想家~1 小时前
在职牛马,因为考过阿里云ACP,浅说下一次过的强度
运维·云计算·网络工程师·阿里云acp·云计算工程师·阿里云acp考试·阿里云acp备考
2501_926978331 小时前
分形时空理论框架:从破缺悖论到意识宇宙的物理学新范式引言(理论概念版)--AGI理论系统基础1.1
java·服务器·前端·人工智能·经验分享·agi
leo_2321 小时前
IP--SMP(软件制作平台)语言基础知识之六十四
服务器·开发语言·tcp/ip·企业信息化·smp(软件制作平台)·应用系统·eom(企业经营模型)