mit6s081——lab1—pingpong

#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"

int main(int argc, char const *argv[])
{
	int pid;
	int p[2];
	pipe(p);

	if (fork() == 0) // child (receive -> send)
	{
		pid = getpid();
		char buf[2];
		if (read(p[0], buf, 1) != 1)
		{
			fprintf(2, "failed to read in child\n");
			exit(1);
		}
		close(p[0]);
		printf("%d: received ping\n", pid);
		if(write(p[1], buf, 1) != 1)
		{
			fprintf(2, "failed to write in child\n");
			exit(1);
		}
		close(p[1]);
		exit(0);
	}else{			// parent (send -> receive)
		pid = getpid();
		char info[2] = "a";
		char buf[2];
		buf[1] = 0;
		if (write(p[1], info, 1) != 1)
		{
			fprintf(2, "failed to write in parent\n");
			exit(1);
		}
		// wait for child to receive ping
		close(p[1]);
		wait(0);
		if(read(p[0], buf, 1) != 1){
			fprintf(2, "failed to read in parent\n");
			exit(1);
		}
		printf("%d: received pong\n", pid);
		close(p[0]);
		exit(0);
	}
}

 注意问题

1.为什么子进程可以直接read:如果父进程这时候没write,子进程再read时会进入阻塞状态,等父进程write后再read,

2.buf是设置的缓冲区,例如子进程把read的数据存在这里,再写

3.子进程关闭p1不会导致父进程p1关闭,所以可以在read完之后直接关闭p0端

4.fprintf的第一个参数:在 C 语言中,标准输入、标准输出和标准错误输出的文件描述符分别是 0、1 和 2

整体顺序:父进程在p1端写入数据,关闭p1端,开始wait等待子进程,子进程在p0端读入数据,子进程关闭p0端,之后向p1端写入数据,写完之后关闭p1端,退出子进程,之后父进程被唤醒,在p0端读取子进程写的数据,之后关闭p0,退出父进程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值