Mit6.S081-实验1-Xv6 and Unix utilities-pingpong问题

在Mit6.S081实验中,遇到pingpong问题主要与wait(0)的使用和管道读写顺序相关。wait(0)用于暂停父进程,等待子进程结束或信号。正确的管道通信顺序应是:父进程写入,子进程读取,子进程写回,父进程读取。子进程读取后关闭读端,写入后关闭写端,而父进程需在读取前使用wait(0)确保子进程已完成写入。
摘要由CSDN通过智能技术生成

Mit6.S081-实验1-Xv6 and Unix utilities-pingpong问题

在进行pingpong实验的时候遇到了许多问题在这里记录一下。

1.输出乱序问题
在这里插入图片描述
出现这个问题主要是因为没有弄懂wait(0)的作用,

wait(0)暂时停止目前进程的执行,直到信号来到或子进程结束,如果在调用wait(0)时子进程已经结束,则wait(0)会立即返回子进程结束状态值。
作者:桀异-Noneofmine https://www.bilibili.com/read/cv8074900/ 出处:bilibili
在父进程和子进程之间使用pipe管道传输数据时,需要等待子进程的传输完成后,父进程再进行读取

pingping实验对管道的读写顺序应该如下:
1、父进程在管道写端写入信息
2、子进程在管道读端读取数据
3、子进程在管道写端写入信息
4、父进程再管道读端读取数据

如果使用一个管道完成应该在每次读写之后关闭所使用的端口,如果使用两个管道完成,应该先关闭不使用的端口

子进程读写管道过程

	if(fork()==0)
	{
		if(read(p1[0],buf,msgsize)!=msgsize)
		{
			printf("c r p1[0] error\n");
			exit(1);
		}
		
		close(p1[0]);

		printf("%d: received %s\n",getpid(),buf);

		if(write(p1[1],"pong",msgsize)!=msgsize)
		{
			printf("c w p1[1] error\n");
			exit(1);
		
		}
		close(p1[1]);
		exit(0);
	}

父进程读写管道过程

if(write(p1[1],"ping",msgsize)!=msgsize)
	{
		printf("f w p1[1] error\n");
		exit(1);
	}
	close(p1[1]);

	wait(0);  //注意在父进程中读取管道信息之前应该等待子进程完成写入信息操作,所以在这里使用wait

	if(read(p1[0],buf,msgsize)!=msgsize)
	{
		printf("f r p2[0] error\n");
		exit(1);
	}
	close(p1[0]);

	printf("%d: received %s\n",getpid(),buf);
	exit(0);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值