Linux系统编程之进程退出,父进程等待子进程退出

article/2025/9/30 3:49:04

1.首先讲一下进程的退出
进程的退出分为正常退出和异常退出:
正常退出:
(1)main函数调用return
(2)进程调用exit(),标准C库
(3)进程调用_exit()或_Exit(),属于系统调用
(4)进程最后一个线程返回
(5)最后一个线程调用pthread_exit

异常退出:
(1)调用abort
(2)当进程收到某些信号时,例如Ctrl+c
(3)最后一个线程对取消(cancellation)请求做出响应

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以上三张图片是对进程退出的补充,
在第二第三张图中的exit(),_exit()_Exit(),这三个函数其实一样的,但习惯用exit()。exit相当于是_exit和_Exit的一个组合。

2.接下来我们介绍一下等待子进程退出以及为什么要等待子进程的退出
在之前我们没学习到等待子进程退出的时候,都是没做等待子进程的操作的,那么这样的子进程都是会变成僵尸进程的。
(1)父进程等待子进程的退出并收集子进程的退出状态,子进程的退出状态不被收集,子进程就会变成僵死进程(僵尸进程)。
在这里插入图片描述
介绍一下等待子进程的相关函数:
在这里插入图片描述
在这里插入图片描述
上图中的waip写错了,应该是wait,waitpid中的有一个选项,可以使调用者不阻塞的选项时options,
在这里插入图片描述
这里的阻塞就是相当于vfork方式创建子进程,父进程处于阻塞状态,让子进程先执行,当父进程收到子进程的退出信号的时候,父进程开始执行。而waitpid不阻塞的机制就有点像fork方式创建的子进程一样,父子进程交替执行,所以这就搞的以waitpid的方式等待有点多余了,所以等待子进程退出还是使用wait函数多,但也有场景需要用waitpid的,所以只是少用waitpid而已。

僵尸进程:Z+
正常进程:即有父进程等待的进程,S+
在这里插入图片描述
这里的11328就是正常进程,11329就是僵尸进程,有时候调用waitpid函数等待子进程的时候在linux 底下有时候子进程是僵尸进程,有时候又是正常的进程,这以自己跑起来相应的程序查看的为准,而调用wait等待子进程的时候,这时子进程是正常的进程。

(2)以wait函数等待子进程:
直接上代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>int main()
{pid_t pid;int status;int cnt = 0;pid = fork();if(pid > 0){wait(&status);while(1){printf("the process of child is Quit,the status is:%d\n",WEXITSTATUS(status));printf("the process is father process,pid is:%d\n",pid);printf("cnt = %d\n",cnt);sleep(3);}}else if(pid == 0){while(1){cnt++;printf("the process is child process,pid is:%d\n",getpid());printf("cnt = %d\n",cnt);sleep(3);if(cnt == 3){exit(3);}}}return 0;
}

结果:
在这里插入图片描述
从结果中可以看出,父进程先是等待子进程执行三次接收到子进程的返回后,才开始执行。
在父进程中我们看到一个WEXITSTATUS(status),这个就是打印出子进程的返回的状态值,子进程的状态值就是exit括号里的,例如exit(3),状态值就是3。

(3)以waitpid的方式等待子进程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
status参数是一个整型指针:
非空:子进程退出状态放在它所指向的地址中;
空:不关心退出状态

此时的pid其实就是此时子进程的ID号,而waitpid是不阻塞机制的,可以看看上面介绍
直接上代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>int main()
{pid_t pid;int status;int cnt = 0;pid = fork();if(pid > 0){
//              wait(&status);waitpid(pid,&status,WNOHANG);printf("pid = %d\n",pid);while(1){
//  printf("the process of child is Quit,the status is:%d\n",WEXITSTATUS(status));printf("the process is father process,pid is:%d\n",getpid());printf("cnt = %d\n",cnt);sleep(3);}}else if(pid == 0){while(1){cnt++;printf("the process is child process,pid is:%d\n",getpid());printf("cnt = %d\n",cnt);sleep(3);if(cnt == 3){exit(3);}}}return 0;
}                         

结果:
在这里插入图片描述
可以看到这里是父进程跟子进程交替执行,当子进程执行三次后退出进程,所以这就是waitpid跟wait的本质区别。

(4)接下来我们来讲一下孤儿进程
孤儿进程:父进程如果不等待子进程退出,在子进程之前就结束了自己的“生命”,此时的子进程就叫做孤儿进程。
而linux避免系统存在过多的孤儿进程,init进程(进程ID号为1)收留孤儿进程,变成孤儿进程的父进程

直接上代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>int main()
{pid_t pid;int cnt = 0;pid = fork();if(pid > 0){printf("this is father process,pid is:%d\n",getpid());}else if(pid == 0){while(1){printf("this is child process,the father is:%d\n",getppid());sleep(3);cnt++;if(cnt == 5){exit(0);}}}return 0;
}

结果:
在这里插入图片描述
从结果中可见除了第一个子进程的父进程的ID号为正常的ID号,下面的那些父进程的ID号都是1,即为init进程。

学习笔记,仅供参考!


http://chatgpt.dhexx.cn/article/8UwaWmdt.shtml

相关文章

linux开发工程师主要是干什么的?

转载自&#xff1a;http://emb.hqyj.com/linux/10328.html 作者&#xff1a;清华远见 在新手眼里&#xff0c;大多数都不知道linux开发工程师主要是干什么的。其实linux开发工程师的主要工作内容有很多&#xff0c;需要学习的知识点也挺多的。学习这些东西以后&#xff0c;就可…

Linux 下怎么查看服务器的cpu和内存的硬件信息

一、top命令 top # 实时显示进程状态用户 和 查看CPU利用率 二、查看总内存的方法&#xff1a; free命令主要用于显示内存数量&#xff0c;如下图中内容所表示 free -h 命令 free -m 命令

如何通过命令查看服务器的内存条使用情况

其实就一个命令就搞定了&#xff1a;dmidecode。 最常用的选项就是用 -t 或者 --type 来限定关键字&#xff1a; bios, system, baseboard, chassis, processor, memory, cache, connector, slot 关于这些关键字可以百度是什么意思&#xff0c; 或者去看man手册页&#xff0c;这…

Linux 查看服务器内存、CPU、网络等占用情况的命令--汇总

搭建测试环境过程中&#xff0c;需要对正在使用的aws服务器&#xff0c;查看它在运行脚本&#xff0c;启动脚本时的内存&#xff0c;CPU&#xff0c;网络等使用情况 1、查看物理CPU个数&#xff1a;cat cat /proc/cpuinfo | grep "physical id" | sort | uniq | w…

服务器显示内存不足怎么查看,怎么查看服务器总内存

怎么查看服务器总内存 内容精选 换一换 华为云帮助中心&#xff0c;为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档&#xff0c;帮助您快速上手使用华为云服务。 当您购买的云服务器规格无法满足业务需要时&#xff0c;可…

Linux查看服务器内存、磁盘、cpu、网络占用、端口占用情况

1、查看物理CPU个数&#xff1a;cat cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l2、查看服务器CPU内核个数&#xff1a;cat 每个物理CPU中core的个数&#xff08;即核数&#xff09; cat /proc/cpuinfo | grep "cpu cores" | uniq 3…

如何查服务器运行内存条,怎么查看服务器的cpu和内存的硬件信息

可以按照如下方式进行操作&#xff1a; 一、查看cpu总个数方法&#xff1a; 1、首先执行top命令&#xff0c;如下图中内容所表示。 2、在top命令的显示界面&#xff0c;按数字键1&#xff0c;即可查看到当前系统中的总cpu数&#xff0c;如下图中内容所表示。 二、查看总内存的方…

如何查看linux 服务器的内存容量

如何查看linux 服务器的内存容量 cat /proc/meminfo cat /proc/meminfo

linux常用查看服务器内存的命令

1.free free 命令用来显示系统内存状态&#xff0c;包括系统物理内存、虚拟内存&#xff08;swap 交换分区&#xff09;、共享内存和系统缓存的使用情况&#xff0c;其输出和 top 命令的内存部分非常相似。 free 命令的基本格式如下&#xff1a; [rootlocalhost ~]# free [选项…

查看SQL-SERVER数据库及各个表的数据量及占用空间大小

1、查看某个数据库&#xff0c;直接执行存储过程sp_spaceused即可 exec sp_spaceused; 2、查看某个表&#xff0c;在存储过程后面加上表名即可 EXEC sp_spaceused T_XXXXX; 3、查看该数据库中的所有表&#xff0c;可以写一个存储过程&#xff0c;然后执行即可 存储过程如下&…

linux查看服务器内存占用情况

查看某个进程的占用内存情况(以‘device_maintenance’为例) 1.查找进程号 ps -ef | grep device_maintenance 或 ps -aux | grep device_maintenance2.查看服务器整体内存占用情况1 3.查看服务器整体内存占用情况2 free -htotal: 内存总数 used: 已经使用内存数 free: 完全…

查看服务器CPU内存

查看linux系统的内存有很多方法,以下为总结版本: 1- 内存:cat /proc/meminfo; cpu:cat /proc/cpuinfo; 2- 查看内存使用情况!!!! 使用命令:free -m 3- 查看CPU使用情况 使用命令:top 基本上使用上述三个命令就可以解决你的问题,以下是对这三个命令的详细…

Linux查看服务器总内存和总硬盘大小

一、linux CPU大小 其实应该通过Physical Processor ID来区分单核和双核。而Physical Processor ID可以从cpuinfo或者dmesg中找到. flags 如果有 ht 说明支持超线程技术 判断物理CPU的个数可以查看physical id 的值&#xff0c;相同则为同一个物理CPU 可以看到上面&#xff0…

Sqlserver 查询数据库内存使用情况

SELECT object_name as 对象名称, cntr_value*0.1*10/1024/1024 as 应用值_M,cntr_value as 应用值,cntr_type as 应用类型,t.counter_name as 计数器名称,t.instance_name as 实例名称 FROM sys.dm_os_performance_counters t WHERE counter_name Total Server Memory (KB) …

查看linux服务器的内存和CPU信息

内存信息&#xff1a; 查看内存信息 # cat /proc/meminfo CPU&#xff1a; 注释&#xff1a; 1、总核数 物理CPU个数 X 每颗物理CPU的核数 2、总逻辑CPU数 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cpuinfo| grep "physical id&qu…

Linux(包括centos) 如何查看服务器内存、CPU

CPU架构 CPU架构主要包括&#xff1a;amd64、arm32v7、arm64v8、mips64el、mips32、ppc64le和ppc32等架构。 CPU信息 CPU信息主要为中央处理器详细信息&#xff0c;包括&#xff1a; 架构核心数量处理速度厂商名称CPU主频标签 … 注&#xff1a;不同的操作系统或者CPU架构提供…

linux查看服务器内存

1. free命令 free 命令显示系统使用和空闲的内存情况&#xff0c;包括物理内存、交互区内存(swap)和内核缓冲区内存。 直接输入free命令&#xff0c;显示如下 free命令默认是显示单位kb&#xff0c;可以采用free -m和free -g命令查看&#xff0c;分别表示MB和GB 另外&#…

查看Linux服务器内存使用情况

1、free 命令 free 命令显示系统使用和空闲的内存情况&#xff0c;包括物理内存、交互区内存(swap)和内核缓冲区内存。 直接输入free命令&#xff0c;显示如下 free命令默认是显示单位kb&#xff0c;可以采用free -m和free -g命令查看&#xff0c;分别表示MB和GB 另外&#…

如何查看linux服务器内存使用情况

1. free命令 free 命令显示系统使用和空闲的内存情况&#xff0c;包括物理内存、交互区内存(swap)和内核缓冲区内存。 直接输入free命令&#xff0c;显示如下 free命令默认是显示单位kb&#xff0c;可以采用free -m和free -g命令查看&#xff0c;分别表示MB和GB 另外&#x…

微信小程序——获取openid

登录流程时序图&#xff1a; 获取openid&#xff1a; //首先我们要调用接口来获取登录凭证&#xff0c;也就是code //从而获取用户们登录的状态信息&#xff0c;其中有一个唯一标示&#xff0c;就是openid和登录要用到的钥匙&#xff08;session_key&#xff09;。 //用户的基…