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

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥Linux系列专栏:Linux基础 🔥

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

在这里插入图片描述


一、僵尸进程

在Linux或Unix系统中,子进程只能由父进程进行回收。
如果进程结束但是进程资源仍未被回收,这个进程将会变为僵尸进程,会导致内存泄漏和系统性能下降。

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

#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;
}

image.png
使用ps aux命令查看进程:

image.png

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

二、wait()函数

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

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

wait()函数返回值

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

wait()函数是阻塞函数,如果进程未结束,wait()函数将会阻塞等待进程结束后再执行
父进程调用wait()后,僵尸进程(子进程)执行完被回收:

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

三、waitpid()函数

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

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

在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)
  • 22
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
waitpid函数用于等待指定的子进程结束,并回收它的资源。其函数原型如下: ```c #include <sys/types.h> #include <sys/wait.h> pid_t waitpid(pid_t pid, int *status, int options); ``` 其中,pid参数表示要等待的子进程的进程ID。如果pid为-1,表示等待任何一个子进程结束;如果pid大于0,表示等待进程ID为pid的子进程结束;如果pid为0,表示等待当前进程组内的任何一个子进程结束;如果pid小于-1,表示等待进程组ID为pid绝对值的任何子进程结束。 status参数是一个指向int类型的指针,用于存储子进程的终止状态信息。如果不关心子进程的终止状态,可以将该参数设置为NULL。 options参数指定waitpid的行为。可以通过以下宏来指定: - WNOHANG:表示如果没有子进程退出,则立即返回,而不是阻塞等待。 - WUNTRACED:表示如果子进程进入暂停状态,则立即返回。 - WCONTINUED:表示如果子进程恢复运行,则立即返回。 waitpid函数的返回值为子进程的进程ID,如果出错则返回-1。 下面是一个使用waitpid函数的示例程序: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> int main() { pid_t pid; int status; pid = fork(); if (pid == 0) { printf("I am child process, pid=%d\n", getpid()); sleep(5); exit(0); } else if (pid > 0) { printf("I am parent process, pid=%d\n", getpid()); waitpid(pid, &status, 0); if (WIFEXITED(status)) { printf("child process exit normally with status=%d\n", WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { printf("child process exit by signal=%d\n", WTERMSIG(status)); } } else { perror("fork error"); exit(1); } return 0; } ``` 该程序创建一个子进程,并等待子进程结束。在子进程中,先输出一行信息,然后暂停5秒钟后退出;在父进程中,等待子进程结束后输出子进程的终止状态信息。注意,子进程的退出状态需要通过WIFEXITED和WEXITSTATUS宏来获取,如果子进程是被信号杀死的,则需要通过WIFSIGNALED和WTERMSIG宏来获取信号编号。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天喜Studio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值