Linux应用编程和网络编程(12、waitpid介绍)

1、waitpid介绍

1.1、waitpid和wait的区别
(1)基本功能一样,都是用来回收子进程
(2)waitpid可以回收指定PID的子进程
(3)waitpid可以阻塞式或非阻塞式两种工作模式
1.2、waitpid原型介绍
(1)参数
(2)返回值
1.3、代码实例
(1)使用waitpid实现wait的效果
ret = waitpid(-1, &status, 0);
-1表示不等待某个特定PID的子进程而是回收任意一个子进程,0表示用默认的方式(阻塞式)来进行等待,返回值ret是本次回收的子进程的PID
(2)ret = waitpid(pid, &status, 0);
等待回收PID为pid的这个子进程,如果当前进程并没有一个ID号为pid的子进程,则返回值为-1,;如果成功回收了pid这个子进程则返回值为回收的进程的PID
(3)ret = waitpid(pid, &status, WNOHANG);
这种表示父进程要非阻塞式的回收子进程。此时如果父进程执行waitpid时子进程已经先结束等待回收则waitpid直接回收成功,返回值是回收的子进程的PID;如果父进程waitpid时子进程尚未结束,则父进程立刻返回(非阻塞),但是返回值为0(表示回收不成功)

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>

int main(void)
{
	pid_t pid = -1;
	pid_t ret = -1;
	int status = -1;
	
	pid = fork();
	if(pid > 0)
	{
		//父进程中
		printf("parent.\n");
		sleep(1);		//该部分主要是为了保证子进程先消亡
		ret = waitpid(-1, status, 0);
		ret = waitpid(pid, status, 0);
		ret = waitpid(pid, &status, WNOHANG);	//非阻塞式

		printf("子进程已经被回收,子进程pid = %d.\n", ret);
		printf("子进程是否正常退出:%d.\n", WIFEXITED(status));
		printf("子进程是否非正常退出:%d.\n", WIFSIGNALED(status));
		printf("正常终止的终止值是:%d.\n", WEXITSTATUS(status));
	}
	else if(pid == 0)
	{
		//子进程中
		sleep(1);
		printf("child pid = %d.\n", getpid());
		return 666}
	else
	{
		perror("fork");
		return -1;
	}
	
	return 0;
}

/*
执行结果:
parent.
child pid = 28804.
子进程已经被回收,子进程pid = 28804.
子进程已经被回收,子进程pid = -1.
子进程已经被回收,子进程pid = 0.
子进程是否正常退出:1.
子进程是否非正常退出:0.
正常终止的终止值是:666.
*/

4、竞态初步引入
(1)竞态全称是“竞争状态,多进程环境下,多个进程同时抢占系统资源(内存、CPU、文件IO)
(2)竞争状态对OS来说是很危险的,此时OS如果没有处理好就会造成结果不确定
(3)写程序当然不希望程序运行的结果不确定,所以我们写程序时要尽量消灭竞争状态。操作系统给我们一个提供了一系列的消灭竞态的机制,我们需要做的是在合适的地方使用合适的方法来消灭竞态

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值