本文用于操作系统学习路上的分享思路和记录学习过程,同时监督自己进行学习,欢迎大佬们指点~
在配置好环境之后开始此次实验。
相应指令:
编写完后用vim Makefile并在UPROGS加入“$U/_xxxx\”,或者用code ./进入vscode来编写;
用make qemu进入模拟器,进入后用CTRL+a x退出模拟器;
用make grade查看成绩,

思路分析
如上图,此次实验要求我们编写pingpong.c,利用管道实现父进程与子进程间的字节通信,并且打印出相应的pid和语句,通过pid来观察进程的独立性。
本实验目的是让我们理解操作系统里面进程的概念,实现进程中的通信,理解进程之间通信的行为,同时掌握简单的系统调用。
使用vim user/user.h进入观察系统调用,本实验我们要用到以下的调用:
int fork(void); //创建一个子进程,会返回两次:父进程中返回子进程的pid,子进程中返回0
int getpid(void); //获取当前进程的pid
int pipe(int*); /*创建一个管道,成功时返回0,失败返回-1,
传入是一个int*类型,说明管道是一个数组
int fd[2]代表一个管道,fd[0]是读端,fd[1]是写端。管道是单向的*/
int write(int, const void*, int); /*写操作,参数1是管道写端或文件描述符,
参数2是待写入的缓冲区,参数3是要写入的字节数*/
int read(int, void*, int); /*读操作,参数1是管道读端或文件描述符,
参数2是存储数据的缓冲区,参数3是最多读取的字节数*/

注意事项
关于头文件,在xv6中貌似不需要引用常规的头文件,根据实验要求引用它给定的.h文件即可。如下:
#include "kernel/types.h"
#include "user.h"
types.h存放的是xv6定义的变量类型,如uint等,不引用时会报错,编译器无法识别user.h里面的相应数据类型。
当报引用types.h后仍报错时也可以试试将type.h改为绝对路径,在终端输入pwd查看。
创建管道应该要在创建子进程之前!! 因为通过 fork() 创建的子进程会继承父进程的管道描述符,从而实现父子进程通信。
记得及时关闭不用的管道端口,使用close(int)来关闭。

3万+

被折叠的 条评论
为什么被折叠?



