【Linux】wait()和waitpid()函数

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!

主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!

🔥Linux系列专栏:Linux基础 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ


目录

一、僵尸进程

在Linux或Unix系统中,子进程只能由父进程进行回收。

如果进程结束但是进程资源仍未被回收,这个进程将会变为僵尸进程,会导致内存泄漏和系统性能下降。

使用getchar() 阻塞父进程的执行,子进程结束后父进程未对其进行回收:

cpp 复制代码
#include <stdio.h>
#include <unistd.h>
int main()
{
	printf("11111111\n");
	pid_t pid;
	pid = fork();
	if(pid > 0)
	{
		//Father
		printf("Father pid:%d \n",getpid());
		getchar();
	}
	else if(pid == 0)
	{
		//Child
		printf("Child pid:%d,Father pid:%d\n",getpid(),getppid());
	}
	else
	{
		perror("processs fail\n");
	}
	printf("22222\n");
	return 0;
}

使用ps aux命令查看进程:

其中Z+符号代表了这是一个僵尸进程

二、wait()函数

使用wait()函数可以用于回收一个僵尸进程

cpp 复制代码
pid_t wait(int* status)	//参数为传出参数,用于获取退出原因/状态,可以传NULL

wait()函数返回值

  • 回收成功,返回僵尸进程的pid
  • 回收失败,返回-1

wait()函数是阻塞函数,如果进程未结束,wait()函数将会阻塞等待进程结束后再执行

父进程调用wait()后,僵尸进程(子进程)执行完被回收:

但是当子进程的代码未执行完时,父进程中的wait()函数将会一直阻塞,下面介绍一个非阻塞的主动回收僵尸进程的函数:

三、waitpid()函数

使用waitpid()函数可以用于回收一个僵尸进程(非阻塞)

cpp 复制代码
pid_t waitpid(pid_t pid,int* status,int options)

函数的返回值:

  • 回收成功,返回僵尸进程的pid
  • 回收失败,返回-1
  • 子进程未结束,非阻塞返回0

pid_t pid:

  • 回收所有的子进程:pid = -1
  • 回收指定的进程:pid = 要回收进程的pid
  • 回收同一组的进程:pid = 0
  • 回收另一个组的进程:将组id传给pid参数,pid < -1

options:

  • 非阻塞立即返回:WNOHANG
  • 阻塞(与wait()函数相同):0

waitpid()相比于wait()的优点

  • 更灵活:waitpid()提供了更多的选项和参数,可以更灵活地控制等待子进程的行为
  • 非阻塞:waitpid()可以实现非阻塞的等待,这样父进程就不会被阻塞,可以继续执行其他任务

|--------------------------------------|
| 大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |

|---------------------------------------------------------------|
| 大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |

相关推荐
Charles Ray11 分钟前
C++学习笔记 —— 内存分配 new
c++·笔记·学习
重生之我在20年代敲代码12 分钟前
strncpy函数的使用和模拟实现
c语言·开发语言·c++·经验分享·笔记
我要吐泡泡了哦1 小时前
GAMES104:15 游戏引擎的玩法系统基础-学习笔记
笔记·学习·游戏引擎
骑鱼过海的猫1231 小时前
【tomcat】tomcat学习笔记
笔记·学习·tomcat
小安运维日记1 小时前
Linux云计算 |【第四阶段】NOSQL-DAY1
linux·运维·redis·sql·云计算·nosql
贾saisai3 小时前
Xilinx系FPGA学习笔记(九)DDR3学习
笔记·学习·fpga开发
北岛寒沫3 小时前
JavaScript(JS)学习笔记 1(简单介绍 注释和输入输出语句 变量 数据类型 运算符 流程控制 数组)
javascript·笔记·学习
烟雨666_java3 小时前
JDBC笔记
笔记
2401_858286113 小时前
52.【C语言】 字符函数和字符串函数(strcat函数)
c语言·开发语言
GEEKVIP3 小时前
Android 恢复挑战和解决方案:如何从 Android 设备恢复删除的文件
android·笔记·安全·macos·智能手机·电脑·笔记本电脑