【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()可以实现非阻塞的等待,这样父进程就不会被阻塞,可以继续执行其他任务

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

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

相关推荐
小政同学2 小时前
【NFS故障】共享的文件无法执行
linux·运维·服务器
AI木马人3 小时前
3.【Prompt工程实战】如何设计一个可复用的Prompt系统?(避免每次手写提示词)
linux·服务器·人工智能·深度学习·prompt
lwf0061643 小时前
导数学习日记
学习·算法·机器学习
ch3nyuyu3 小时前
Ubuntu(乌班图)基础指令
linux·运维·网络
qeen873 小时前
【编程日记】现阶段总结
学习
minglie13 小时前
gcc编译器汇总
linux
daanpdf4 小时前
新视野大学英语视听说教程2第四版听力音频原文及答案
笔记
白菜欣5 小时前
Linux —《开发三件套:gcc/g++、gdb、make/Makefile 全解析》
linux·运维
freshman_y5 小时前
一篇介绍C语言中二级指针和二维数组的文章
c语言·开发语言
senijusene5 小时前
基于 imx6ull平台按键驱动开发:input子系统+中断子系统+platform总线
linux·驱动开发