wait和waitpid函数

本文详细解析了Unix/Linux系统中wait与waitpid函数的功能与用法,包括它们的阻塞与非阻塞版本的区别、如何获取子进程状态以及如何指定等待特定进程等特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、wait函数

代码:

<pre name="code" class="cpp">#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
	pid_t id = fork();
	if(id == 0){
	printf("child:pid:%d,ppid:%d\n",getpid(),getppid());
	sleep(10);
	exit(3);
	}else{
		printf("This is a father\n");
		int status = 0;
		pid_t dead_id = wait(&status);//父进程等待子进程退出,即使父进程先运行完,也会等待子进程运行完
		if(dead_id == -1){
		perror("error");
		}else{
			printf("dead_id:%d\n",dead_id);
			printf("child exit code:%d\n",(status>>8)&0xff);
			//printf("child exit code:%d\n",WEXITSTATUS(status));
			printf("child get signal:%d\n",status&0xff);
			//printf("child get signal:%d\n",WIFEXITED(status));
		}
	}
	return 0;
}



运行结果:

二、wait函数

代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
	pid_t id = fork();
	if(id == 0){
	printf("child:pid:%d,ppid:%d\n",getpid(),getppid());
	sleep(10);
	exit(3);
	}else{
		printf("This is a father\n");
		int status = 0;
		pid_t dead_id = waitpid(id,&status,0);//父进程等待子进程退出
		if(dead_id == -1){
		perror("error");
		}else{
			printf("dead_id:%d\n",dead_id);
			printf("child exit code:%d\n",(status>>8)&0xff);
			//printf("child exit code:%d\n",WEXITSTATUS(status));
			printf("child get signal:%d\n",status&0xff);
			//printf("child get signal:%d\n",WIFEXITED(status));
		}
	}
	return 0;
}
运行结果:

三、总结:

wait提供的是阻塞版本
waiptpid提供了wait没有提供的三个功能:
1. waitpid可等待一个特定的进程
2. waitpid提供了一个wait的非阻塞版本
3. waitpid支持作业控制


两者返回值:成功返回被等待进程pid,失败返回-1


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值